[{"content":"Office E5 自动订阅程序\n2023-04-07 起网站暂时关闭，停止调用 这两天出现大量 E5 账户被“强制”过期，到期时间被重置为 0/0，避免影响其他账户的到期时间，所以暂时将调用关闭。\n可能是滥用的太多了，对使用了本程序的 E5 进行了“强制”过期，还好的是留了 1 个月时间可以转移 OD 里的资源，所以大家尽快备份资源吧。\n初步判断是根据以下几个原因锁定的 E5。\n根据调用服务器的 IP 根据在 AZ 面板里应用设置的回调地址，也就是 https://e5.qyi.io/xxxxxxxxxxxx 所以还没有被 “过期”的童鞋，在 az 面板 里将应用删除了吧，或者将回调地址删了也行。\n历史 2023-01-15 : 官方将回调地址 https://e5.qyi.io/outlook/auth2/receive 设置为黑名单，填写了该地址的应用都将判断为“钓鱼”应用。关于续订程序出现授权出错问题\n2023-02-17 : GitHub 将用于登录的 GitHub Apps 暂停，导致无法登录。无任何通知，就回调的时候提示被暂停，当时有发过工单询问原因，到目前 (04-07) 未收到回复。\n2023-04-04 : 对使用了本程序的 E5 进行了“强制”过期。\n看了下今年官方对用 续订程序 的操作来看，其实在 1-15 就开始“不满”了，进行了限制，我现在才反应过来，当时因该停止服务端的调用，减少损失。\n程序于 2023 年 01 月 15 日更新部署教程有些许不同，请注意查看。 AZ 面板中已经被禁用的应用，无法删除，需要新建一个应用。\n查看应用是否被禁用：关于续订程序出现授权出错问题\n由于我前端是废的，界面将就看看就行了，不影响程序~\n申请 office E5 开发者试用的教程\n新版可续签的 Office 365 开发者试用订阅！E5(附自动续订的方法)\nOnedrive 容量 1T 修改 为 5T，老帐号不删除重建\n说明 此程序部署在我的服务器上，每隔 2 小时会自动调用 outlook api 获取邮件列表。 对于信息：只会保存必要的 client_id、client_secret，其他任何内容都不会保存。 会读取授权的 outlook 账号邮箱邮件，但不会保存任何信息，仅仅是调用 api。 请单独创建一个同域 E5 子账号进行授权，不要使用此账号进行发送、接收个人邮件，以免发生误会。 新手作代码辣鸡，估计会出现各种问题，所以还是不建议自己搭建。\n项目地址：\nhttps://github.com/luoye663/e5\n使用教程 1、注册自己的 api key 登录进入 azure ，登录账号使用你的 e5 账户，就是以 xxx.onmicrosoft.com 开头的账户。\n搜索“应用注册”。\n2021-03-15： 现在不能直接搜索到了，目前两种方法可以找到 “应用注册”。\n1）请搜索 “Azure Active Directory”，然后在 管理 - 应用注册 2）或者直接点击直达链接： https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps\n点击 “新注册”：\n2023-01-15 更新 和之前不同的是：\n受支持的帐户类型，请选择第一个：仅此组织目录(仅 xxx - 单一租户)中的帐户。 重定向 URI (可选) 暂时不要填写。 3）点击注册后记录以下信息: 应用程序(客户端)ID 客户端密码 目录(租户)ID 创建客户端密码：\n2021-03-07： 最近很多同学反应授权报错 Invalid client secret is provided. 这里请注意了，客户端密码请复制 “值”，不要复制 ID。\n2021-08-19： 客户端密码这里已经没有了“从不”，只能选 2 年。（别在意这些，谁也不知道 2 年后微软的策略会不会变，2 年换一次密钥也不麻烦）\n保存好以上 2 个 key，一会需要用到。\n配置 api 权限：\n勾选一下四个选项后，同时点击 代表 XX 授予管理员同意。\nPS: 这一步如果用的是子账号创建的 api，那么这一项是灰色的，不能点击。需要登录管理员账号，再点击 代表 XX 授予管理员同意。\n这个时候 api 的配置就算完成了。\n2、添加 key 到自动订阅程序 进入 https://e5.qyi.io/\n这里需要 GitHub 账户登录，同样的，我只能获取你在 GitHub 中的用户 id、用户名等基础信息（邮箱获取不了），其他的任何信息也获取不到（可自行尝试注册一个 GitHub Apps 测试）。\n登录后进入主页面。\n2023-01-01： 进入主页面后，请先获取回调地址，每个人的地址都不同，请不要泄露以及复制别人的。\n这一步骤是为了减少被判定为钓鱼应用的风险。\n将这个地址复制，粘贴到 Azure 面板，步骤如下：\n新建应用 名称随意输入，只是个标识而已，描述可空。\n点击 配置 填入上一步记录的：\n应用程序(客户端)ID 客户端密码 租户 ID 点击下一步进行配置调用时间：\n说明：单位 秒（最低调用频率为 60 秒，最高为 6 小时），例如: 30-60，代表在 30 秒-60 秒之间随机调用一次。 再点击下一步，到了 授权。\n此时会跳转到 Microsoft Online OAuth2.0 授权页面，在这里请注意使用同一个域下的空账号(子账号)进行授权。\n（因为在这一步我能获取到授权的 outlook 账户邮件，但是程序不会保存，仅仅是调用 api。）以免在以后发生误会。\n点击 “接受” 后，将会跳转回自动订阅程序。\n到此时，授权就完成了。\n3、下一步 已经没啦~\n到这里你就可以不用管了，程序会每两个小时调用一次 outlook 的 api。\n界面写得辣鸡，因为我不会前端呀~大家将就看看就行了。\n过几天我会把删除功能加上，可以删除在程序里注册的账户。\n交流群：959720211（已被封）\n二群: 546596275\n还是要说一下隐私安全问题 因为有几个读者也说到了，统一回答下：\napi 权限仅拥有 openid offline_access Mail.Read Mail.ReadWrite Mail.ReadBasic Mail.ReadBasic.ALL 这 6 个权限。 也就是说我仅仅能读取授权账户的邮件，其他任何事都做不了，且我写的这个程序没有保存任何除 key 之外的信息。 所以一开始我就说了，用子账户进行授权（空账户）及创建 api，这样不涉及到隐私及安全问题。 如果实在担心不想用了，直接在 azure 删掉 api 就可以了。 （空） 4、FQA Q：日志是空的\nA：如果是新加入的账户，请等待系统自动调用。\nQ：参数错误\nA：如果 应用 id 与 密钥 都没有错误的情况下，那么创建的时候看一下 “任何组织目录（任何 Azure AD 目录-多租户）中的帐户和个人 Microsoft 帐户（例如，Skype、Xbox）” 有没有选这个。\nQ：什么时候续期\nA：最后一个月中的任意一天会进行续期，目前是微软程序检测活跃情况，人工点击“一键续期”？？？\nQ：REST API is not yet supported for this mailbox.\nA：创建子账号的时候需要给 outlook 许可。\nQ：显示 “此订阅处于非活动状态，将很快过期”\nA：这个提示是少于 30 天就会显示，并非根据活跃情况显示的。\nQ：过期了怎么办\nA：在过期后的 2 个月内订阅还是可以用的，所以可以在 2 个月内取回数据。如果在过期 1 个月都还没有续订的话，那么就可以开始转移数据了。\nQ：续期历史\n2020-04-28 续期一次\n2020-06-26 续期一次\n貌似从 6 月 26 日开始后，基本上每天都会检测订阅，难道现在不用人工点击“一键续期”了？\n5、注意问题 如果是在到期一个月调用，那么请用管理员账户登录，因为这个时候除了管理员能登录 outlook 以外，其他的子账户都不行! 6、关闭双重验证 群友发的：\n6、更新日志 2020-03-04：\n加入调用时间显示，每日 0 点清空。 2020-04-17 11:12：\n更新完成，加入随机调用时间。 会读取邮箱前 5 封邮件。 2020-04-21 01:04：\n由于消息队列没有配置好，导致无法正常随机调用 api 问题。（已修复） 2020-04-22 23:04：\n修复新注册的童鞋没有显示日志问题。 在调用时间范围内重复问题。 2020-08-19\n维护中\u0026hellip;\u0026hellip;\n2020-08-23\n已恢复\n2020-12-20\n增加同一账户多应用调用\n","permalink":"https://blog.curlc.com/archives/687/","summary":"\u003cp\u003eOffice E5 自动订阅程序\u003c/p\u003e","title":"E5 自动订阅程序[已开源]"},{"content":" 在物联网场景中，如果需要将设备数据转发到第三方平台，为了不影响IOT平台性能，通常将设备数据通过 Kafka 进行高速传输，但很多第三方平台只提供 HTTP 接口。如何在两者之间搭建一座\u0026quot;高性能、不丢消息\u0026quot;的桥梁？\nps: 本文的目的是记录一个项目设计过程，便于日后复盘，但暂不提供实际压测指标（如吞吐量、延迟、资源消耗）\n一、业务背景 1.1 场景描述 这个项目源于一个智慧停车业务场景。路边停车的摄像头设备会实时上报两类数据：\n车辆出入事件：每当一辆车驶入或驶出泊位，摄像头会抓拍一组图片（全景图、车牌图、特写图等），并生成一条包含车牌号、出入时间、可信度等字段的 JSON 消息 心跳抓拍图：摄像头每 5 分钟自动拍摄一张泊位照片，用于确认设备在线状态和泊位实时状态 这些消息由设备端统一推送IOT平台，再转发到 Kafka 集群，转发服务从中消费消息转换字段格式后，实时转发给第三方停车管理平台。第三方平台只提供 HTTP REST 接口，不支持 Kafka 直连。\n请注意: 后续文章中写的 JVM 崩溃 只是大致的说辞，实际可能是 程序意外、服务器意外断电等等。这里将\u0026quot;JVM 崩溃\u0026quot;定义为\u0026quot;服务异常\u0026quot;。\n1.2 核心需求 听起来像是一个简单的\u0026quot;消费 Kafka → 发 HTTP\u0026quot;需求，但深入分析后会发现几个关键：\n需求一：消息绝对不能丢。 每一条车辆出入事件都对应一次真实的停车计费。如果丢了\u0026quot;驶入\u0026quot;事件，用户可能免费停车；如果丢了\u0026quot;驶出\u0026quot;事件，用户可能被永久计费。这不仅仅是技术问题，直接关系到收费准确性。\n需求二：字段映射后再转发。 Kafka 中的消息结构和第三方平台要求的格式差异很大。比如出入类型的枚举值不同（Kafka 用 0/1 表示出/进，平台用 1/2 表示驶入/驶出），可信度字段可能一个是小数一个是整数，图片路径格式不一致，图片类型的枚举映射也存在一对多关系。\n需求三：并发压力不可预测。 高峰期（早晚通勤）可能有大量车辆集中进出，QPS 瞬间飙升；而大部分时间消息量很低。系统既要在高峰期扛住压力，又不能为低峰期浪费过多资源。\n需求四：第三方平台可能不稳定。 HTTP 接口可能超时、返回 5xx、或者返回业务错误码。我们不能因为对方服务不可用就丢掉消息，必须有可靠的重试机制。\n1.3 整体架构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 Kafka Broker │ batch poll (max 500 records) ▼ DeviceDataKafkaListener (3 并发分区线程) │ 每条消息先 INSERT 到 PostgreSQL ▼ ForwardDispatcher │ tryAcquire(Semaphore) ◄─── 背压阀门 (max-concurrency) ▼ VirtualThreadExecutor (Project Loom) │ ▼ HttpForwardService │ JDK HttpClient (HTTP/2, 非阻塞) │ ├─► 2xx → SUCCESS ├─► 非2xx/超时 → PENDING, 计算指数退避 └─► 超过 maxAttempts → FAILED ▲ RetryScheduler ────────────────────┘ 每 5s 扫描 PENDING \u0026amp; next_retry_at \u0026lt;= NOW() SELECT … FOR UPDATE SKIP LOCKED (多实例安全) 这里因该已经注意到一个不太常规的设计：每条消息在 HTTP 转发之前，先写入 PostgreSQL。这么设计的思考过程，在后续详细展开。\n二、技术栈选型 组件 选型 选型理由 JDK 26 虚拟线程 (Project Loom)，极低内存并发 框架 Spring Boot 3.3 成熟生态，自动装配 Kafka 客户端 Spring Kafka（批量监听） 批量 poll 提升吞吐 HTTP 客户端 JDK HttpClient 内置 HTTP/2，零额外依赖 并发模型 虚拟线程 + Semaphore 天然背压，无需手动管理线程池 数据库 PostgreSQL + Spring Data JPA 持久化重试，SKIP LOCKED 分布式安全 ID 生成 雪花算法 (Snowflake) 趋势递增，B+Tree 友好 监控 Micrometer + Prometheus 标准可观测性 为什么选虚拟线程而不是 Reactor/WebFlux？ 响应式编程（WebFlux + Netty）确实能以极少的线程处理大量并发，但它带来了两个问题：一是调试困难，堆栈信息难以追踪；二是整个调用链都必须是响应式的，一旦中间有阻塞操作就会前功尽弃。\n而 虚拟线程 提供了\u0026quot;代码写起来像同步阻塞，运行起来像异步非阻塞\u0026quot;的体验。每个 HTTP 转发任务就是一个普通的虚拟线程，代码直观、易维护，同时内存开销极低。500 个并发虚拟线程只消耗约 2MB，而同样数量的平台线程需要约 100MB 栈内存(ps: 这里的数值是大致的值，只是为了有个简单的比较)。\n为什么选 JDK HttpClient 而不是 OkHttp/Apache HttpClient？ 项目只需要做简单的 POST 请求转发，不需要连接池管理、拦截器、重试策略等高级功能。JDK 11+ 内置的 HttpClient 已经支持 HTTP/2、异步请求、超时控制，完全够用，还能减少一个外部依赖。\n为什么用雪花 ID 而不是数据库自增或 UUID？ 数据库自增 ID 在分布式多实例部署时会冲突；UUID 是随机值，作为 PostgreSQL 主键会导致 B+Tree 索引频繁分裂，写入性能差。雪花 ID 既是全局唯一的，又是趋势递增的，对索引友好。而且从 ID 本身就能反推出大致的生成时间，排查问题非常方便。\n三、核心设计：为什么先写 DB 再异步 HTTP？ 3.1 三种方案的对比 面对\u0026quot;消费 Kafka → 发 HTTP\u0026quot;这个需求，常见有三种做法：\n方案 A：纯内存转发（最快但不安全）\n1 Kafka → 内存队列 → HTTP 转发 吞吐量最高，但 JVM 崩溃或重启时，内存队列中的消息全部丢失。对于停车计费场景，这是不可接受的。\n方案 B：先转发再写 DB（看似合理但有隐患）\n1 Kafka → HTTP 转发 → 写 DB 记录结果 HTTP 转发成功但写 DB 失败时，这条消息既没有 DB 记录，下次也不会被重新消费（Kafka offset 已提交），等于消息丢了。\n方案 C：先写 DB 再转发（本项目采用）\n1 Kafka → 写 DB → 提交 offset → 异步 HTTP 转发 3.2 为什么方案 C 最安全 优点 核心逻辑是：先持久化，后处理。\nKafka 消息到达后，立即 INSERT 到 PostgreSQL（状态为 PENDING） 所有消息落库完成后，手动提交 Kafka offset 然后才把消息提交到虚拟线程进行 HTTP 转发 这样一来，无论在哪个环节出问题，消息都不会丢：\n落库后、提交 offset 前 JVM 崩溃：offset 没有提交，重启后会重新投递这些消息。而 messageKey 唯一索引保证重复消费不会产生重复记录 提交 offset 后、HTTP 转发前 JVM 崩溃：DB 中已有 PENDING 记录，RetryScheduler 重启后会自动扫出这些记录继续投递 HTTP 转发失败：记录状态被设回 PENDING 并计算下次重试时间，等待 RetryScheduler 在合适的时机重新投递 缺点: 这个方案虽然安全，但其本质是将原本由 Kafka 承载的高并发压力转移到了数据库上,所以尽可能避免虚拟线程发起http时持有数据库连接。\n四、关键代码实现 4.1 启动类 —— 开启虚拟线程 1 2 3 4 5 6 7 8 9 10 11 12 13 @Slf4j @SpringBootApplication // 启用 `RetryScheduler` 的定时任务能力，每 5 秒扫描一次需要重试的记录。 @EnableScheduling public class KafkaForwarderApplication { public static void main(String[] args) { // 让 Spring Boot 全局启用虚拟线程支持——Tomcat 请求处理线程、@Scheduled` 调度线程、`@Async` 异步任务等，都会自动使用虚拟线程。 System.setProperty(\u0026#34;spring.threads.virtual.enabled\u0026#34;, \u0026#34;true\u0026#34;); SpringApplication.run(KafkaForwarderApplication.class, args); log.info(\u0026#34;Kafka Forwarder 启动成功。\u0026#34;); } } 4.2 核心 Bean 配置 —— 虚拟线程 + 背压阀门 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 @Configuration @EnableConfigurationProperties(ForwarderProperties.class) public class AppConfig { @Bean(destroyMethod = \u0026#34;close\u0026#34;) public ExecutorService virtualThreadExecutor() { return Executors.newVirtualThreadPerTaskExecutor(); } @Bean public Semaphore httpConcurrencySemaphore(ForwarderProperties props) { int permits = props.getExecutor().getMaxConcurrency(); return new Semaphore(permits, true); } @Bean public HttpClient httpClient(ForwarderProperties props) { ForwarderProperties.Http httpCfg = props.getHttp(); return HttpClient.newBuilder() .version(HttpClient.Version.HTTP_2) .connectTimeout(Duration.ofSeconds(httpCfg.getConnectTimeoutSeconds())) .executor(Executors.newVirtualThreadPerTaskExecutor()) .followRedirects(HttpClient.Redirect.NORMAL) .build(); } } 为什么要用 Semaphore 做背压？\n虚拟线程的创建成本极低，理论上可以无限制地创建。如果不加限制，在 Kafka 消费速度远超 HTTP 吞吐速度时（比如第三方平台突然变慢），会瞬间创建数万个虚拟线程同时等待 HTTP 响应。虽然虚拟线程本身不占多少内存，但每个并发请求都会占用一个数据库连接和一个 TCP 连接，最终可能导致数据库连接池耗尽或 OOM。\nSemaphore 的作用就是一道\u0026quot;阀门\u0026quot;：当 in-flight 的 HTTP 请求达到上限（默认 100）时，新消息不再投递到虚拟线程，而是保持在 DB 中的 PENDING 状态，等待 RetryScheduler 后续处理。这样既保护了系统，又不会丢消息。\n注意 new Semaphore(permits, true) 中的 true 参数表示公平模式，确保等待时间最长的任务优先获得许可，防止某些消息被无限期饿死。\n为什么 HttpClient 也要指定虚拟线程执行器？\nJDK HttpClient 的异步回调（如响应处理）默认使用公共 ForkJoinPool。显式指定虚拟线程执行器后，HTTP 响应回调也在虚拟线程上执行，避免阻塞 ForkJoinPool 中的平台线程。\n4.3 Kafka 消费配置 —— 手动提交 + 批量模式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Bean public ConcurrentKafkaListenerContainerFactory\u0026lt;String, String\u0026gt; kafkaListenerContainerFactory( ConsumerFactory\u0026lt;String, String\u0026gt; consumerFactory) { ConcurrentKafkaListenerContainerFactory\u0026lt;String, String\u0026gt; factory = new ConcurrentKafkaListenerContainerFactory\u0026lt;\u0026gt;(); factory.setConsumerFactory(consumerFactory); factory.setConsumerFactory(consumerFactory); // 并发线程数 = 分区数，这里的listenerConcurrency=3 factory.setConcurrency(listenerConcurrency); // 启用批量模式，一次 onMessage 调用处理多条消息 factory.setBatchListener(true); // 手动立即提交 offset factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL_IMMEDIATE); // 容器级错误处理：间隔 1s 重试 3 次，之后记录日志并跳过（数据已在DB中） factory.setCommonErrorHandler(new DefaultErrorHandler(new FixedBackOff(1000L, 3L))); return factory; } 这里有几个关键设计：\n为什么用 MANUAL_IMMEDIATE 而不是自动提交？\nKafka 默认的自动提交策略是定期提交 offset，不关心消息是否真正处理成功。如果在自动提交之后、HTTP 转发之前 JVM 崩溃，这些消息就永远不会被重新消费。使用 MANUAL_IMMEDIATE 精确控制提交时机：只有当整批消息全部写入 DB 后，才调用 ack.acknowledge() 提交 offset。这就是 at-least-once 语义的保证。\n为什么用批量模式（setBatchListener(true)）？\n单条消费模式下，每收到一条消息就触发一次 Listener 方法调用，增加 Spring 事务管理、方法栈等开销。批量模式下，一次 poll 拿到的 500 条消息作为一个 List 传入，我们可以在方法内循环处理，减少框架层面的重复开销。\nps: 这里的500是再配置文件中 max-poll-records 配置的batch fetch size。\n并发数设计\n这和 Kafka Topic 的分区数有关。Spring Kafka 的 concurrency 参数决定了创建多少个 KafkaMessageListenerContainer，每个容器负责消费一个分区。如果并发数大于分区数，多余的容器会空闲；如果小于分区数，部分容器需要消费多个分区。一般建议并发数等于分区数。\n错误处理器为什么只重试 3 次就跳过？\nDefaultErrorHandler(new FixedBackOff(1000L, 3L)) 表示如果 Listener 方法本身抛出异常（比如 JSON 解析失败），间隔 1 秒重试 3 次。如果仍然失败就跳过这条消息，记录错误日志。之所以不无限重试，是因为 Listener 层面的异常通常是数据格式问题（比如消息体不是合法 JSON），重试多少次都不会成功。而且消息已经落库了，后续可以通过人工处理 FAILED 记录来补救。\n4.4 Kafka Listener —— 幂等入库 + 异步投递 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 @KafkaListener( topics = \u0026#34;${forwarder.kafka.vehicle-event-topic}\u0026#34;, groupId = \u0026#34;${spring.kafka.consumer.group-id}\u0026#34;, containerFactory = \u0026#34;kafkaListenerContainerFactory\u0026#34; ) public void onVehicleEvent( List\u0026lt;ConsumerRecord\u0026lt;String, String\u0026gt;\u0026gt; records, Acknowledgment ack) { processBatch(records, ack, ApiType.VEHICLE_EVENT); } private void processBatch(List\u0026lt;ConsumerRecord\u0026lt;String, String\u0026gt;\u0026gt; records, Acknowledgment ack, ApiType apiType) { for (ConsumerRecord\u0026lt;String, String\u0026gt; cr : records) { String messageId = extractMessageId(cr); ForwardRecord record = ForwardRecord.builder() .messageKey(ForwardRecord.buildMessageKey(messageId)) .apiType(apiType) .payload(cr.value()) .status(ForwardStatus.PENDING) .build(); dispatcher.dispatchAsync(record); } ack.acknowledge(); } 为什么用 messageId 而不是 Kafka offset 做幂等键？\nKafka offset 是相对于 Topic-Partition 的，看起来很适合做唯一标识。但有一个问题：如果 Kafka 管理员因为某种原因重置了 consumer group 的 offset（earliest 或 latest），大量\u0026quot;旧\u0026quot;消息会被重新消费。此时 offset 虽然相同，但消息可能已经被成功转发过了。\n而我选择从消息 JSON 中提取 messageId 字段作为幂等键。这个 ID 是上游IOT平台生成的，天然全局唯一，不受 Kafka offset 变化影响。配合数据库的 message_key 唯一索引，即使同一条消息被消费 100 次，也只会入库一次。\n如果 messageId 缺失怎么办？\n我在代码中做了降级处理：如果消息 JSON 中没有 messageId 字段，就用 topic + partition + offset 的组合作为备选键，同时打印一条 WARN 日志提醒运维人员排查上游数据问题。这样既不会因为上游数据质量问题而丢失消息，又能及时发现问题。\n为什么 ack.acknowledge() 放在循环外面？\n这是 at-least-once 语义的关键。所有消息全部处理（落库）完成后，才一次性提交 offset。如果放在循环内部每条消息处理后就提交，那么第 300 条消息处理完提交后，如果第 301 条消息处理时 JVM 崩溃，前 300 条的 offset 已提交、但第 301~500 条永远不会被重新消费。\n4.5 ForwardDispatcher —— 幂等 + 背压 + 虚拟线程投递 这是整个系统的调度中枢，也是最复杂的部分。\n踩坑：主键冲突（PSQLException: duplicate key）\n最初的实现中，dispatchAsync 方法加了 @Transactional，内部先 INSERT 再异步投递。但问题在于：异步投递是在虚拟线程中执行的，虚拟线程中的 httpForwardService.forward() 会执行另一次 repository.save() 来更新记录状态。如果外层事务还没提交，虚拟线程中的 save 会尝试用同一个 ID 再次 INSERT（因为事务隔离，虚拟线程看不到外层未提交的 INSERT），导致主键冲突。\n解决方案：将\u0026quot;落库\u0026quot;和\u0026quot;投递\u0026quot;彻底拆分\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public boolean dispatchAsync(ForwardRecord record) { String messageKey = record.getMessageKey(); // 幂等检查 Optional\u0026lt;ForwardRecord\u0026gt; existing = repository.findByMessageKey(messageKey); if (existing.isPresent()) { return handleExistingRecord(existing.get(), messageKey); } // 独立事务 INSERT，方法返回时数据已提交 record.setId(snowflakeIdGenerator.nextId()); ForwardRecord saved = saveNewRecord(record); return submitToVirtualThread(saved, \u0026#34;首次投递\u0026#34;); } @Transactional(propagation = Propagation.REQUIRES_NEW) public ForwardRecord saveNewRecord(ForwardRecord record) { return repository.save(record); } saveNewRecord 使用 Propagation.REQUIRES_NEW 独立事务，确保方法返回时数据已经 COMMIT。这样虚拟线程中的后续操作（UPDATE）看到的是已提交的数据，走的是 UPDATE 逻辑而不是 INSERT，彻底避免了主键冲突。\n幂等处理：四种状态分别怎么处理\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 private boolean handleExistingRecord(ForwardRecord record, String messageKey) { return switch (record.getStatus()) { case SUCCESS -\u0026gt; { log.info(\u0026#34;[id={}] 已成功，跳过重复消费\u0026#34;, record.getId()); yield true; } case FAILED -\u0026gt; { log.warn(\u0026#34;[id={}] 已 FAILED，跳过（需人工处理）\u0026#34;, record.getId()); yield true; } case PENDING, IN_PROGRESS -\u0026gt; { yield submitToVirtualThread(record, \u0026#34;重复消费-已有记录\u0026#34;); } }; } 这里的判断逻辑是：\nSUCCESS：说明之前已经成功转发过了，直接跳过。这是最理想的幂等场景——Kafka 重复投递了一条已经成功的消息 FAILED：已经耗尽了所有重试次数，不能再自动重试了，需要人工介入。跳过是为了避免无限循环 PENDING / IN_PROGRESS：说明之前尝试过但还没成功（可能上次 JVM 在转发过程中崩溃了），直接重新投递。注意这里不会重新 INSERT，只是把已有的记录重新提交到虚拟线程 Semaphore 背压的实现\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 private boolean submitToVirtualThread(ForwardRecord record, String label) { boolean acquired = httpConcurrencySemaphore .tryAcquire(timeoutMs, TimeUnit.MILLISECONDS); if (!acquired) { // Semaphore 满了，记录保持 PENDING 状态 // RetryScheduler 会在下次扫描时重新尝试投递 return false; } virtualThreadExecutor.submit(() -\u0026gt; { try { httpForwardService.forward(record); } finally { httpConcurrencySemaphore.release(); } }); return true; } 注意 tryAcquire 有超时时间（默认 5 秒）。这意味着消费线程在获取不到许可时会等待 5 秒，而不是立即放弃。如果 5 秒内有其他 HTTP 请求完成释放了许可，当前消息就可以立即投递。只有等待 5 秒后仍然没有许可，才会放弃并返回 false。\n返回 false 后，消息在 DB 中的状态是 PENDING，RetryScheduler 会在下一个周期（5 秒后）重新扫描到这条记录并尝试投递。这就是\u0026quot;背压不丢消息\u0026quot;的实现机制。\n4.6 HttpForwardService —— 单次 HTTP 转发 + 指数退避 这个类负责一次完整的 HTTP 转发尝试。使用 Propagation.REQUIRES_NEW 独立事务，确保每次转发结果都被及时提交，不受外层事务影响。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 @Transactional(propagation = Propagation.REQUIRES_NEW) public void forward(ForwardRecord record) { ForwarderProperties.Retry retryCfg = props.getRetry(); // 1. 标记为处理中，增加尝试次数 record.setStatus(ForwardStatus.IN_PROGRESS); record.setAttemptCount(record.getAttemptCount() + 1); repository.save(record); // 2. 构建请求（包含字段映射转换） HttpRequest httpRequest = requestBuilder.build(record); // 3. 发送 HTTP 请求并计时 long startMs = System.currentTimeMillis(); HttpResponse\u0026lt;String\u0026gt; response = httpClient.send( httpRequest, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8)); long durationMs = System.currentTimeMillis() - startMs; // 4. 根据响应更新状态 // ... } 为什么要先标记 IN_PROGRESS 再发请求？\n如果直接发 HTTP 请求，在请求过程中 JVM 崩溃了，DB 中的记录状态仍然是 PENDING。RetryScheduler 重新投递时，会从头开始一次新的请求。但如果对方平台收到了请求并成功处理，这就变成了重复推送。\n而先标记 IN_PROGRESS，即使 JVM 在 HTTP 请求过程中崩溃，RetryScheduler 看到的是一条 IN_PROGRESS 记录（而非 PENDING），可以据此判断：这条记录可能正在被另一个实例处理，或者上次处理中断了，需要更谨慎地处理。\nHTTP 响应不是简单的 2xx 就成功\n处理的不是简单的 HTTP 状态码判断。第三方平台的响应格式是：\n1 2 3 4 5 // 成功 { \u0026#34;result\u0026#34;: 0, \u0026#34;data\u0026#34;: {} } // 业务失败 { \u0026#34;result\u0026#34;: 1, \u0026#34;errcode\u0026#34;: \u0026#34;999\u0026#34;, \u0026#34;errmsg\u0026#34;: \u0026#34;上级系统发生错误\u0026#34; } HTTP 200 但 result != 0 也是失败。需要进一步判断 errcode：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 if (resp.isSuccess()) { record.setStatus(ForwardStatus.SUCCESS); } else if (\u0026#34;4\u0026#34;.equals(resp.getErrcode())) { // errcode=4 是\u0026#34;重复上报\u0026#34;，平台已忽略，视为成功 record.setStatus(ForwardStatus.SUCCESS); } else if (!resp.isRetryable()) { // errcode=998 明确说\u0026#34;无需重发\u0026#34;，直接标记失败 markFailed(record, 200, errMsg); } else if (record.getAttemptCount() \u0026gt;= retryCfg.getMaxAttempts()) { // 可重试但超过最大次数 markFailed(record, 200, errMsg); } else { // 可重试，计算下次重试时间 scheduleRetry(record, retryCfg); } errcode=4（重复上报）这个处理很有必要：因为本项目的 at-least-once 语义可能导致同一条消息被转发多次，平台返回 errcode=4 说明它已经处理过了，因此可以安全地标记为成功。\n指数退避策略\n1 2 3 4 5 private long computeDelay(int attemptCount, ForwarderProperties.Retry cfg) { double delay = cfg.getInitialIntervalSeconds() * Math.pow(cfg.getMultiplier(), attemptCount - 1); return Math.min((long) delay, cfg.getMaxIntervalSeconds()); } 以默认配置为例（初始 5 秒，因子 2.0，上限 300 秒，最多 5 次）：\n失败次数 等待时间 说明 第 1 次 5s 5 × 2^0 第 2 次 10s 5 × 2^1 第 3 次 20s 5 × 2^2 第 4 次 40s 5 × 2^3 第 5 次 FAILED 超过 maxAttempts，标记终态 为什么用指数退避而不是固定间隔？如果第三方平台短暂故障，大量消息同时以固定间隔重试，会产生\u0026quot;重试风暴\u0026quot;，进一步加剧对方压力。指数退避让重试间隔逐渐增大，给对方恢复的时间。\n4.7 RetryScheduler —— 数据库持久化重试 这是保证消息不丢的最后一道防线。\n1 2 3 4 5 6 7 8 9 10 11 12 @Scheduled(fixedDelayString = \u0026#34;${forwarder.retry.scheduler-fixed-delay-ms:5000}\u0026#34;) @Transactional public void processPendingRetries() { List\u0026lt;ForwardRecord\u0026gt; candidates = repository.findPendingForRetry( ForwardStatus.PENDING, Instant.now(), PageRequest.of(0, batchSize)); for (ForwardRecord record : candidates) { dispatcher.dispatchRetry(record); } } 为什么不使用内存队列（如 BlockingQueue）做重试？\n内存队列的问题是：JVM 崩溃时队列中的数据全部丢失。假设有 100 条消息因为第三方平台故障正在等待重试，此时 JVM 重启了，这 100 条消息就永远丢了。\n而我的方案是将重试记录持久化在 PostgreSQL 中。next_retry_at 字段记录了下次应该重试的时间，RetryScheduler 每 5 秒扫一次数据库，把到期的记录捞出来重新投递。JVM 重启后，调度器自动恢复，未完成的记录会被继续处理。\n多实例安全：SKIP LOCKED 详解\n1 2 3 4 5 6 7 8 9 10 11 @Lock(LockModeType.PESSIMISTIC_WRITE) @Query(\u0026#34;\u0026#34;\u0026#34; SELECT r FROM ForwardRecord r WHERE r.status = :status AND (r.nextRetryAt IS NULL OR r.nextRetryAt \u0026lt;= :now) ORDER BY r.nextRetryAt ASC NULLS FIRST, r.id ASC \u0026#34;\u0026#34;\u0026#34;) List\u0026lt;ForwardRecord\u0026gt; findPendingForRetry( @Param(\u0026#34;status\u0026#34;) ForwardStatus status, @Param(\u0026#34;now\u0026#34;) Instant now, Pageable pageable); 生产环境通常会部署多个实例做高可用。如果两个实例同时扫表，可能捞到相同的记录并重复发送 HTTP 请求。为了解决这个问题，在查询中使用了两个关键机制。\n@Lock(LockModeType.PESSIMISTIC_WRITE) 的作用 这是 JPA 的悲观写锁注解，Spring Data JPA 会自动在生成的 SQL 末尾追加 FOR UPDATE。生成的实际 SQL 等价于：\n1 2 3 4 5 6 SELECT * FROM forward_records WHERE status = \u0026#39;PENDING\u0026#39; AND (next_retry_at IS NULL OR next_retry_at \u0026lt;= NOW()) ORDER BY next_retry_at ASC NULLS FIRST, id ASC LIMIT 100 FOR UPDATE FOR UPDATE 的含义是：查到的每一行都会被加上行级排他锁。在当前事务提交或回滚之前，其他事务不能修改、删除这些行，也不能用 FOR UPDATE 锁定它们。\n但这里有一个问题：如果两个实例几乎同时执行这条 SQL，实例 B 的 FOR UPDATE 会阻塞等待实例 A 释放锁。这虽然保证了正确性，但让实例 B 白白等待，浪费了调度周期。\nSKIP LOCKED 的作用 Spring Data JPA 默认不会加 SKIP LOCKED，需要通过 Hibernate 的 hint 或自定义原生查询来启用。在本项目中，通过在 application.yml 中配置 Hibernate 方言来支持 SKIP LOCKED：\n1 2 3 4 5 spring: jpa: properties: hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect 当 Hibernate 检测到 @Lock(PESSIMISTIC_WRITE) 配合 PostgreSQL 方言时，会在 SQL 中追加 SKIP LOCKED：\n1 2 3 4 5 6 SELECT * FROM forward_records WHERE status = \u0026#39;PENDING\u0026#39; AND (next_retry_at IS NULL OR next_retry_at \u0026lt;= NOW()) ORDER BY next_retry_at ASC NULLS FIRST, id ASC LIMIT 100 FOR UPDATE SKIP LOCKED SKIP LOCKED 让查询跳过已被其他事务锁定的行，而不是等待。这样实例 B 不会阻塞，而是拿到未被锁定的记录。\n完整的多实例并发执行过程 假设数据库中有 6 条 PENDING 记录（ID: 1~6），两个实例几乎同时触发 RetryScheduler，每次最多取 3 条：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 时间线： T0: DB 中有 6 条 PENDING 记录：[记录1, 记录2, 记录3, 记录4, 记录5, 记录6] T1: 实例 A 开启事务 Tx-A，执行： SELECT ... FOR UPDATE SKIP LOCKED LIMIT 3 → 锁定 记录1, 记录2, 记录3 → 返回给实例 A T2: 实例 B 开启事务 Tx-B，执行： SELECT ... FOR UPDATE SKIP LOCKED LIMIT 3 → 记录1 已被 Tx-A 锁定，SKIP（跳过） → 记录2 已被 Tx-A 锁定，SKIP（跳过） → 记录3 已被 Tx-A 锁定，SKIP（跳过） → 记录4 未锁定，锁定并返回 → 记录5 未锁定，锁定并返回 → 记录6 未锁定，锁定并返回 → 返回给实例 B：[记录4, 记录5, 记录6] T3: 实例 A 处理 [记录1, 记录2, 记录3]，分别发起 HTTP 转发 实例 B 处理 [记录4, 记录5, 记录6]，分别发起 HTTP 转发 → 两个实例并行工作，互不干扰，每条记录只被处理一次 T4: 实例 A 转发完成，COMMIT Tx-A → 记录1/2/3 的锁释放 实例 B 转发完成，COMMIT Tx-B → 记录4/5/6 的锁释放 如果实例 A 在 T3 崩溃了会怎样？\n1 2 3 4 5 6 T3\u0026#39;: 实例 A 崩溃，Tx-A 自动 ROLLBACK → 记录1/2/3 的锁释放，状态仍然是 PENDING（IN_PROGRESS 的 UPDATE 被 ROLLBACK） T5: 下一次 RetryScheduler 扫描周期（5秒后） → 记录1/2/3 再次被捞出来，重新投递 → 消息不丢 为什么不直接用普通的 FOR UPDATE？ 对比一下两种方案在多实例场景下的表现：\n场景 FOR UPDATE（无 SKIP LOCKED） FOR UPDATE SKIP LOCKED 实例 A 和 B 同时扫表 B 阻塞等待 A 释放锁 B 跳过 A 锁定的行，立即拿到可用记录 实例 A 处理慢 B 一直等待，调度周期浪费 B 拿到自己的记录，并行处理 实例 A 崩溃 B 最终等到锁，正常处理 记录在 A 回滚后被下次扫描捞到 结果 串行处理，吞吐受限 并行处理，吞吐翻倍 为什么不用 Redis 分布式锁？ 很多人在多实例场景下第一反应是引入 Redis 分布式锁。但这会带来额外复杂度：需要维护 Redis 集群、处理锁超时、处理锁续期、处理 Redis 宕机后的降级策略……而 SKIP LOCKED 直接利用数据库本身的能力，零额外组件，代码无需感知多实例的存在。\n简单来说：如果并发控制粒度是数据库行级别，且已经用了 PostgreSQL，SKIP LOCKED 几乎总是比 Redis 分布式锁更好的选择。\n4.9 消息字段映射（MessageMapper） 这部分代码量大但逻辑直接——就是做字段转换。挑几个有代表性的转换讲一下设计考量。\n出入类型转换（反向映射）\nKafka 中 inoutType：0 = 出场，1 = 进场。第三方平台 enter_state：1 = 驶入，2 = 驶出。注意这两个枚举不是简单的 1:1 映射，而是反过来的：Kafka 的\u0026quot;出\u0026quot;(0) 对应平台的\u0026quot;驶出\u0026quot;(2)，Kafka 的\u0026quot;进\u0026quot;(1) 对应平台的\u0026quot;驶入\u0026quot;(1)。这种不一致在对接第三方系统时非常常见，如果搞反了，车辆进出记录就会全部颠倒。\n1 2 3 4 5 6 7 private String convertInoutType(Integer inoutType, long itemId) { return switch (inoutType) { case 0 -\u0026gt; \u0026#34;2\u0026#34;; // 出场 → 驶出 case 1 -\u0026gt; \u0026#34;1\u0026#34;; // 进场 → 驶入 default -\u0026gt; \u0026#34;1\u0026#34;; // 未知默认驶入 }; } 可信度转换（小数 → 百分比整数）\nKafka 中的可信度是 01 的小数（如 0.854），平台要求 0100 的整数字符串（如 \u0026ldquo;85\u0026rdquo;）。注意这里用的是 Math.round 而不是强转 (int)，因为 0.995 × 100 = 99.5，round 会得到 100，强转会得到 99。\n1 2 3 4 5 private String convertCredible(Double credible, String fieldName, long itemId) { if (credible == null) return \u0026#34;0\u0026#34;; int val = (int) Math.round(credible * 100); return String.valueOf(Math.max(0, Math.min(100, val))); } 五、状态机设计 每条消息在 forward_records 表中的生命周期，本质上是一个有限状态机：\n1 2 3 4 5 PENDING ──► IN_PROGRESS ──► SUCCESS (终态 ✓) │ ├──► PENDING (失败，等待重试) │ └──► FAILED (终态 ✗，超过最大重试次数) 5.1 为什么需要 IN_PROGRESS 状态？ 初看之下，PENDING 和 SUCCESS/FAILED 三种状态就够了。加 IN_PROGRESS 是为了解决一个具体问题：区分\u0026quot;还没开始处理\u0026quot;和\u0026quot;正在处理中\u0026quot;。\n想象一个场景：RetryScheduler 扫到了一条 PENDING 记录，正准备投递到虚拟线程。但就在同一瞬间，另一个 RetryScheduler 实例（多实例部署）也扫到了同一条记录。如果没有 IN_PROGRESS 状态，两个实例可能同时投递同一条消息。\n有了 IN_PROGRESS 后，查询条件是 WHERE status = PENDING，不包括 IN_PROGRESS。一旦记录开始被处理，状态变为 IN_PROGRESS，其他调度器就不会再捞到它。\n当然，在本项目的实现中，SKIP LOCKED 已经在数据库层面解决了并发问题。IN_PROGRESS 状态更像是一个应用层的\u0026quot;防重保险\u0026quot;，双重保护。\n5.2 为什么重试是原地更新而不是新建记录？ 每次重试是对同一条记录的 UPDATE（attempt_count +1，next_retry_at 后移），而不是 INSERT 一条新记录。这样设计有三个好处：\n好处一：幂等性天然保证。 因为整条消息的生命周期只有一条记录，messageKey 唯一索引只需要防住\u0026quot;首次入库\u0026quot;的重复即可。如果每次重试都新建记录，幂等逻辑会变得复杂得多。\n好处二：状态追踪简单。 查一条记录就能看到当前是第几次尝试、上次失败原因是什么、下次什么时候重试。不需要关联查询多条记录再排序。\n好处三：数据库压力更小。 一条消息从消费到成功，主表只产生 1 行记录（多次 UPDATE），而不是 N 行记录（多次 INSERT）。\n5.3 双表设计：主表 + 重试日志表 虽然主表只保留最新状态，但每次尝试的详细过程被记录在 forward_retry_logs 表中：\n1 2 forward_records (1) ────── (*) forward_retry_logs id (雪花ID) ←──────── record_id 为什么不用一张大表记录所有信息？因为主表需要被高频查询和更新（消费、转发、重试调度都在操作它），保持字段精简可以提升查询性能。而重试日志表是追加写入的，只在排查问题时才查询（\u0026ldquo;这条消息为什么失败了？第几次失败的？当时返回了什么错误码？\u0026quot;），不需要高频访问。\n两表分离是\u0026quot;热点数据\u0026quot;和\u0026quot;冷数据\u0026quot;的典型分离模式。\n六、监控指标 6.1 指标注册实现 监控系统基于 Micrometer，通过 MetricsService 在应用启动时注册自定义 Gauge 指标。Gauge 是一种\u0026quot;实时采样\u0026quot;指标——每次 Prometheus 来抓取数据时，Gauge 会调用提供的 lambda 表达式获取最新值。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 @Slf4j @Service @RequiredArgsConstructor public class MetricsService { private final MeterRegistry meterRegistry; private final ForwardRecordRepository repository; private final Semaphore httpConcurrencySemaphore; @PostConstruct public void registerGauges() { // 待转发记录数（含等待重试） Gauge.builder(\u0026#34;forwarder.records.pending\u0026#34;, () -\u0026gt; (double) repository.countByStatus(ForwardStatus.PENDING)) .description(\u0026#34;待转发记录数（含等待重试）\u0026#34;) .register(meterRegistry); // 当前 in-flight 的 HTTP 请求数 Gauge.builder(\u0026#34;forwarder.records.in_progress\u0026#34;, () -\u0026gt; (double) repository.countByStatus(ForwardStatus.IN_PROGRESS)) .description(\u0026#34;当前 HTTP 请求 in-flight 记录数\u0026#34;) .register(meterRegistry); // 累计转发成功数 Gauge.builder(\u0026#34;forwarder.records.success\u0026#34;, () -\u0026gt; (double) repository.countByStatus(ForwardStatus.SUCCESS)) .description(\u0026#34;累计转发成功记录数\u0026#34;) .register(meterRegistry); // 已耗尽重试次数的失败数（需人工干预） Gauge.builder(\u0026#34;forwarder.records.failed\u0026#34;, () -\u0026gt; (double) repository.countByStatus(ForwardStatus.FAILED)) .description(\u0026#34;已耗尽重试次数的失败记录数（需人工干预）\u0026#34;) .register(meterRegistry); // Semaphore 剩余许可数 Gauge.builder(\u0026#34;forwarder.semaphore.available_permits\u0026#34;, () -\u0026gt; (double) httpConcurrencySemaphore.availablePermits()) .description(\u0026#34;HTTP 并发 Semaphore 剩余许可数（为 0 表示满载）\u0026#34;) .register(meterRegistry); log.info(\u0026#34;Forwarder 自定义 Micrometer 指标注册完成\u0026#34;); } } 为什么用 Gauge 而不是 Counter？\nMicrometer 有两种常见的指标类型：\nCounter：只增不减的计数器，适合统计\u0026quot;总请求数\u0026rdquo;、\u0026ldquo;总错误数\u0026quot;等累计值 Gauge：可增可减的实时值，适合统计\u0026quot;当前积压量\u0026rdquo;、\u0026ldquo;当前在线数\u0026quot;等瞬时值 项目中 forwarder.records.pending 是一个会上下波动的值（消息消费后减少、转发失败后又增加），所以必须用 Gauge。而 forwarder.records.success 虽然只增不减，但用 Gauge 也没问题——Gauge 只是在每次抓取时执行一次 SELECT COUNT(*)，返回当前值。\ncountByStatus 的实现\nRepository 层只需要一个简单的 Spring Data JPA 方法，自动生成 SELECT COUNT(*) FROM forward_records WHERE status = ?：\n1 2 3 4 @Repository public interface ForwardRecordRepository extends JpaRepository\u0026lt;ForwardRecord, Long\u0026gt; { long countByStatus(ForwardStatus status); } 性能考量：每次 Prometheus 抓取（默认 15 秒一次）会触发 5 次 SELECT COUNT(*) 查询。在数据量较大时（百万级以上），可以考虑：\n用 PostgreSQL 的近似计数 SELECT reltuples FROM pg_class WHERE relname = 'forward_records' 代替精确 COUNT 或在应用层维护一个 AtomicLong 计数器，在状态变更时增减，避免每次查库 6.2 Prometheus 抓取配置 Spring Boot Actuator 已经暴露了 Prometheus 端点，application.yml 中的配置：\n1 2 3 4 5 6 7 8 management: endpoints: web: exposure: include: health, info, prometheus, metrics endpoint: health: show-details: always Prometheus 在 prometheus.yml 中添加抓取任务：\n1 2 3 4 5 6 scrape_configs: - job_name: \u0026#39;kafka-forwarder\u0026#39; metrics_path: \u0026#39;/actuator/prometheus\u0026#39; scrape_interval: 15s static_configs: - targets: [\u0026#39;192.168.18.175:8080\u0026#39;] 抓取到的指标原始数据长这样（/actuator/prometheus 端点输出）：\n1 2 3 4 5 6 7 8 9 10 11 # HELP forwarder_records_pending 待转发记录数（含等待重试） # TYPE forwarder_records_pending gauge forwarder_records_pending 12.0 # HELP forwarder_records_failed 已耗尽重试次数的失败记录数 # TYPE forwarder_records_failed gauge forwarder_records_failed 2.0 # HELP forwarder_semaphore_available_permits HTTP 并发 Semaphore 剩余许可数 # TYPE forwarder_semaphore_available_permits gauge forwarder_semaphore_available_permits 87.0 6.3 Grafana 面板关键 PromQL 以下是在 Grafana 中配置的核心看板和告警规则：\n看板 1：消息积压趋势\n1 2 3 4 5 # 最近 1 小时的待转发记录数变化 forwarder_records_pending # 积压速率（每秒新增积压量，正数说明消费跟不上生产） rate(forwarder_records_pending[5m]) 如果 rate 持续为正数，说明系统消费能力不足，需要考虑扩容实例数或调大 Semaphore 许可数。\n看板 2：系统吞吐与健康度\n1 2 3 4 5 6 7 8 # 成功记录的增长速率（每秒成功转发多少条） rate(forwarder_records_success[5m]) # 当前 in-flight 数（应该 ≤ Semaphore 许可数） forwarder_records_in_progress # Semaphore 利用率（已用许可 / 总许可） (100 - forwarder_semaphore_available_permits) / 100 * 100 Semaphore 利用率长期接近 100% 说明 HTTP 转发是瓶颈，可以考虑调大 max-concurrency 或优化下游接口性能。\n看板 3：失败记录告警\n1 2 3 4 5 # 失败记录绝对值 forwarder_records_failed # 失败记录增长速率 rate(forwarder_records_failed[10m]) 6.4 指标汇总表 指标 类型 数据源 告警建议 forwarder.records.pending Gauge SELECT COUNT(*) WHERE status='PENDING' 持续增长 → 消费能力不足 forwarder.records.in_progress Gauge SELECT COUNT(*) WHERE status='IN_PROGRESS' 应 ≤ Semaphore 许可数 forwarder.records.success Gauge SELECT COUNT(*) WHERE status='SUCCESS' 关注 rate() 趋势 forwarder.records.failed Gauge SELECT COUNT(*) WHERE status='FAILED' 大于 0 立即告警 forwarder.semaphore.available_permits Gauge semaphore.availablePermits() 为 0 说明系统满载 为什么 forwarder.records.failed 大于 0 就应该告警？\n每一条 FAILED 记录都意味着一条消息经过多次重试仍然无法送达。可能的原因包括：第三方平台长期故障、消息格式不兼容、账号认证过期等。这些都需要人工介入处理，所以应该第一时间告警。\n处理 FAILED 记录的方式通常是：修复问题后，手动将记录状态改回 PENDING，让 RetryScheduler 自动重新投递：\n1 2 3 4 5 6 7 -- 手动恢复 FAILED 记录，触发重新投递 UPDATE forward_records SET status = \u0026#39;PENDING\u0026#39;, next_retry_at = NULL, attempt_count = 0 WHERE status = \u0026#39;FAILED\u0026#39; AND id = \u0026lt;目标记录ID\u0026gt;; 七、生产部署 Schema 迁移：将 ddl-auto 改为 validate，使用 Flyway/Liquibase 管理表结构变更，避免 Hibernate 自动建表带来的不可控风险 定期清理：SUCCESS 记录按策略归档删除（建议保留 7~30 天），避免表膨胀影响查询性能 FAILED 告警：监控 forwarder.records.failed 指标，超过阈值触发告警，人工介入处理 多实例部署：SKIP LOCKED 已天然支持多实例并行调度，无需额外配置，直接水平扩展即可 死信队列：开启 forwarder.dead-letter.enabled: true，FAILED 记录同步写入 Kafka DLQ，方便集中消费和处理 八、总结 这个项目虽然体量不大，但涉及的工程问题很有代表性。\n问题 解决方案 核心思想 消息不能丢 先写 DB 再转发 + 持久化重试调度 持久化优先，处理在后 Kafka 重复消费 messageKey 唯一索引幂等去重 业务 ID 做幂等，而非 offset 高并发 HTTP 虚拟线程 + Semaphore 背压 低成本并发 + 流量控制 分布式重试安全 SELECT ... FOR UPDATE SKIP LOCKED 数据库级别的分布式锁 主键冲突 Bug REQUIRES_NEW 独立事务拆分 事务边界与异步边界不能混用 多接口路由 ApiType 枚举 + MessageMapper 策略映射 类型驱动路由 重试风暴 指数退避 + 上限控制 逐步增加重试间隔 最重要的一条：在消息不丢这个硬约束下，数据库不是瓶颈而是保障。先持久化再处理的模式虽然增加了 DB 写入开销，但换来的是确定性的数据安全。性能问题可以通过连接池调优、批量查询优化等手段逐步改善，但数据丢失是无法弥补的。\n附录：系统完整流程图 A. 消息处理主流程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 ┌─────────────────────────────────────────────────────────────────────────────┐ │ Kafka Broker │ │ topic: device-vehicle-event / device-heartbeat │ └──────────────────────────────────┬──────────────────────────────────────────┘ │ batch poll (max 500 records) │ concurrency = 3 (分区线程) ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ DeviceDataKafkaListener │ │ │ │ for each record in batch: │ │ 1. extractMessageId() ← 从 JSON 提取 messageId │ │ 2. 构建 ForwardRecord ← messageKey = messageId │ │ 3. dispatcher.dispatchAsync() ← 幂等入库 + 异步投递 │ │ │ │ ack.acknowledge() ← 全部落库后才提交 offset │ └──────────────────────────────────┬──────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ ForwardDispatcher │ │ │ │ ┌─────────────────────┐ ┌─────────────────────────────────────────────┐ │ │ │ 幂等检查 │ │ messageKey 不存在（首次消费） │ │ │ │ SELECT by messageKey│ │ │ │ │ │ │ │ 1. snowflakeIdGenerator.nextId() │ │ │ │ 已存在： │ │ 2. saveNewRecord() ← REQUIRES_NEW 独立事务│ │ │ │ ├─ SUCCESS → 跳过 │ │ 3. submitToVirtualThread() │ │ │ │ ├─ FAILED → 跳过 │ │ │ │ │ │ └─ PENDING → 重新 │ └──────────────────────┬──────────────────────┘ │ │ │ 投递 │ │ │ │ └─────────────────────┘ │ │ └────────────────────────────────────────────────────┼──────────────────────┘ │ ▼ ┌──────────────────────────────────────┐ │ Semaphore tryAcquire (背压阀门) │ │ max-concurrency = 100 │ │ timeout = 5000ms │ └──────────┬───────────────┬───────────┘ │ │ 获取成功 获取失败(超时) │ │ ▼ ▼ ┌──────────────┐ 记录保持 PENDING │ 提交到虚拟 │ 等 RetryScheduler │ 线程执行器 │ 下次扫描处理 │ │ │ Executors │ │ .newVirtual │ │ ThreadPer │ │ TaskExecutor │ └──────┬───────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ HttpForwardService │ │ (在虚拟线程中执行) │ │ │ │ 1. UPDATE status = IN_PROGRESS, attempt_count + 1 │ │ │ │ 2. PlatformRequestBuilder.build(record) │ │ ├─ 反序列化 Kafka JSON (KafkaVehicleEventMessage / KafkaHeartbeatMsg) │ │ ├─ MessageMapper 字段映射转换 │ │ │ ├─ inoutType: 0→\u0026#34;2\u0026#34;(驶出), 1→\u0026#34;1\u0026#34;(驶入) │ │ │ ├─ plateCredible: 0.854 → \u0026#34;85\u0026#34; │ │ │ ├─ picType: 1→\u0026#34;1\u0026#34;, 2→\u0026#34;2\u0026#34;, 3→\u0026#34;0\u0026#34;, 4→\u0026#34;2\u0026#34; │ │ │ └─ picUrl: jieshun/xxx.jpg → /jieshun/xxx.jpg │ │ ├─ 注入 access_name / access_pwd │ │ └─ 构建 HttpRequest (POST JSON) │ │ │ │ 3. JDK HttpClient.send() ──── HTTP/2 ────► 第三方平台 API │ │ ├─ /mch/business (车辆出入事件) │ │ └─ /mch/heartbeat (心跳抓拍图) │ │ │ │ 4. 根据响应判断结果： │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ HTTP 非 2xx / 超时 / 异常 │ │ │ │ → scheduleRetry(): status=PENDING, 计算指数退避 │ │ │ │ → 超过 maxAttempts → FAILED (终态) │ │ │ ├──────────────────────────────────────────────────────────┤ │ │ │ HTTP 2xx + result=0 │ │ │ │ → SUCCESS (终态) │ │ │ ├──────────────────────────────────────────────────────────┤ │ │ │ HTTP 2xx + errcode=4 (重复上报) │ │ │ │ → SUCCESS (视为成功，平台已幂等处理) │ │ │ ├──────────────────────────────────────────────────────────┤ │ │ │ HTTP 2xx + errcode=998 (无需重发) │ │ │ │ → FAILED (终态，不重试) │ │ │ └──────────────────────────────────────────────────────────┘ │ │ │ │ 5. 写入 forward_retry_logs (每次尝试的详细日志) │ │ │ │ 6. Semaphore.release() ← 释放许可 │ └─────────────────────────────────────────────────────────────────────────────┘ B. RetryScheduler 重试流程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ┌─────────────────────────────────────────────────────────────────────────────┐ │ RetryScheduler (@Scheduled, 每 5s) │ │ │ │ SELECT * FROM forward_records │ │ WHERE status = \u0026#39;PENDING\u0026#39; │ │ AND (next_retry_at IS NULL OR next_retry_at \u0026lt;= NOW()) │ │ ORDER BY next_retry_at ASC NULLS FIRST, id ASC │ │ LIMIT 100 │ │ FOR UPDATE SKIP LOCKED ◄─── 行级排他锁 + 跳过已锁定行 │ │ │ │ 多实例场景: │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 实例 A │ │ 实例 B │ │ 实例 C │ │ │ │ 锁定 │ │ SKIP │ │ SKIP │ │ │ │ 记录 1~ │ │ 记录 1~ │ │ 记录 1~ │ │ │ │ 100 │ │ 100, │ │ 100, │ │ │ │ │ │ 锁定 │ │ 101~ │ │ │ │ │ │ 记录 │ │ 200, │ │ │ │ │ │ 101~200 │ │ 锁定 │ │ │ │ │ │ │ │ 记录 │ │ │ │ │ │ │ │ 201~300 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ │ └──────────────────┴──────────────────┘ │ │ │ │ │ ▼ │ │ 每条记录 → dispatcher.dispatchRetry() │ │ │ │ │ ▼ │ │ submitToVirtualThread() │ │ (与主流程相同，经过 Semaphore → 虚拟线程 → HTTP 转发) │ └─────────────────────────────────────────────────────────────────────────────┘ C. 状态机流转图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 ┌────────────────────────────────────────────┐ │ │ ▼ │ ┌─────────┐ HTTP开始转发 ┌──────────────┐ HTTP成功 ┌─────────┐ │ │ ───────────────► │ │ ─────────────► │ │ │ PENDING │ │ IN_PROGRESS │ │ SUCCESS │ │ │ ◄─────────────── │ │ │ (终态) │ └────┬────┘ 转发失败 └──────┬───────┘ └─────────┘ │ (attempt \u0026lt; max) │ │ │ 转发失败 │ │ (attempt \u0026gt;= max) │ ▼ │ ┌─────────┐ │ │ │ └──────────────────────► │ FAILED │ RetryScheduler │ (终态) │ 重新投递 └─────────┘ 生命周期示例 (maxAttempts=5, initial=5s, multiplier=2): T=0s Kafka 消息到达 → INSERT (status=PENDING, attempt=0) T=0s 首次投递 → UPDATE (status=IN_PROGRESS, attempt=1) → HTTP 请求 T=0s HTTP 失败 → UPDATE (status=PENDING, next_retry_at=T+5s) T=5s RetryScheduler 扫描 → 投递 → (status=IN_PROGRESS, attempt=2) → HTTP T=5s HTTP 失败 → (status=PENDING, next_retry_at=T+15s) // 5×2=10s T=15s RetryScheduler 扫描 → 投递 → (status=IN_PROGRESS, attempt=3) → HTTP T=15s HTTP 失败 → (status=PENDING, next_retry_at=T+35s) // 10×2=20s T=35s RetryScheduler 扫描 → 投递 → (status=IN_PROGRESS, attempt=4) → HTTP T=35s HTTP 失败 → (status=PENDING, next_retry_at=T+75s) // 20×2=40s T=75s RetryScheduler 扫描 → 投递 → (status=IN_PROGRESS, attempt=5) → HTTP T=75s HTTP 失败 → (status=FAILED) // attempt=5 \u0026gt;= maxAttempts=5, 终态 D. 崩溃恢复场景 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 场景 1：落库后、提交 offset 前 JVM 崩溃 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Kafka 消息到达 │ ▼ INSERT 到 DB (status=PENDING) ← 已持久化 │ ▼ 💥 JVM 崩溃！ │ ▼ Kafka offset 未提交 → 重启后 Kafka 重新投递 │ ▼ 消费端幂等检查: messageKey 已存在 + status=PENDING │ ▼ 不重复 INSERT，直接重新投递到虚拟线程 ✅ 消息不丢 场景 2：提交 offset 后、HTTP 转发前 JVM 崩溃 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ INSERT 到 DB + 提交 offset │ ▼ 💥 JVM 崩溃！ │ ▼ DB 中存在 PENDING 记录 (next_retry_at=NULL) │ ▼ RetryScheduler 5秒后扫到 → 重新投递 ✅ 消息不丢 场景 3：HTTP 转发过程中 JVM 崩溃 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ UPDATE (status=IN_PROGRESS) + HTTP 请求发出 │ ▼ 💥 JVM 崩溃！ │ ▼ 情况 A: HTTP 请求未到达第三方 → RetryScheduler 重新投递 ✅ 消息不丢 情况 B: HTTP 请求已到达，第三方已处理 → RetryScheduler 重新投递 → 第三方返回 errcode=4 (重复上报) → 标记为 SUCCESS ✅ 消息不丢，且不重复 场景 4：HTTP 转发成功后、DB UPDATE 前 JVM 崩溃 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ HTTP 请求成功 (第三方已处理) │ ▼ 💥 JVM 崩溃！(status 仍然是 IN_PROGRESS) │ ▼ RetryScheduler 重新投递 → 第三方返回 errcode=4 (重复上报) → 标记为 SUCCESS ✅ 消息不丢，且不重复 E. 数据库表关系 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ┌──────────────────────────────────────┐ ┌──────────────────────────────────────┐ │ forward_records (主表) │ │ forward_retry_logs (日志表) │ ├──────────────────────────────────────┤ ├──────────────────────────────────────┤ │ id BIGINT (PK, 雪花ID) │ │ id BIGINT (PK, 雪花ID) │ │ message_key VARCHAR(64) (UNIQUE) │◄──────│ record_id BIGINT (FK → 主表) │ │ api_type VARCHAR(30) │ │ attempt_number INT │ │ kafka_topic VARCHAR(255) │ │ result_status VARCHAR(20) │ │ kafka_partition INT │ │ http_status INT │ │ kafka_offset BIGINT │ │ platform_errcode VARCHAR(20) │ │ kafka_key VARCHAR(512) │ │ error_message VARCHAR(1000) │ │ payload TEXT │ │ duration_ms BIGINT │ │ status VARCHAR(20) │ │ attempted_at TIMESTAMP │ │ attempt_count INT │ │ next_retry_at TIMESTAMP │ │ next_retry_at TIMESTAMP │ └──────────────────────────────────────┘ │ last_http_status INT │ │ last_error VARCHAR(1000) │ 关系：forward_records (1) ←→ (*) forward_retry_logs │ created_at TIMESTAMP │ │ updated_at TIMESTAMP │ 主表：当前状态快照（高频读写） │ succeeded_at TIMESTAMP │ 日志表：每次尝试详情（追加写入，低频查询） └──────────────────────────────────────┘ 索引： idx_fr_message_key → message_key (UNIQUE) 幂等去重 idx_fr_status_next_retry → status, next_retry_at RetryScheduler 扫描 idx_fr_created_at → created_at 定期清理 idx_frl_record_id → record_id 查询重试历史 ","permalink":"https://blog.curlc.com/posts/virtual-thread-kafka-http-proxy/","summary":"\u003cblockquote\u003e\n\u003cp\u003e在物联网场景中，如果需要将设备数据转发到第三方平台，为了不影响IOT平台性能，通常将设备数据通过 Kafka 进行高速传输，但很多第三方平台只提供 HTTP 接口。如何在两者之间搭建一座\u0026quot;高性能、不丢消息\u0026quot;的桥梁？\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eps: 本文的目的是记录一个项目设计过程，便于日后复盘，但暂不提供实际压测指标（如吞吐量、延迟、资源消耗）\u003c/p\u003e","title":"基于 虚拟线程 构建高性能 Kafka → HTTP 转发服务"},{"content":"无意间，看见阿里云提供了针对 Qwen3-0.6B 的蒸馏教程，本文章本质上是跟着阿里云提供的教程学习微调过程，官方教程地址。\n借用下阿里云教程的介绍：\n大参数模型效果好，但成本高、响应慢。为了在保障效果的同时提升推理速度、降低成本，可首先借助大参数模型完成目标任务的数据生成，并使用这些数据微调小参数模型，使其在特定任务中达到接近大参数模型的表现，这一过程也被称为模型蒸馏。\n本方案将以从一句话中提取结构化信息（如收件人、地址、电话）为例，演示如何通过模型蒸馏，让 Qwen3-0.6B 模型在此任务上达到大参数模型的表现。\n方案信息 教师模型： GLM4.7\n样本信息： 由 GLM4.7 生成约1500+条虚拟数据\n微调框架： ms-swift\n模型推理： vllm\n效果 改动部分 新增了postal_code、remark字段，但postal_code在样本训练时没有特地添加，而是在 system 提示词内加的，所以不一定准确，最主要的还是“从地址推邮编”本质是 地理编码/检索问题，仅靠 0.6B 蒸馏感觉还不如由应用层处理。 我重新试用GLM4.7生成了一批 2K 训练样本，没有使用阿里云提供的，主要目的是想提取备注。 样本重新生成 包含功能区/开发区/高新区/未来科技城/管委会等 包含自治区/自治州/盟/旗等多级行政 包含英文/拼音混排行政区（extracted 中要映射为中文规范名称） 包含括号备注/路线提示/near地铁口/(原xxx)/收件要求/门禁暗号/时间要求 电话号码带空格、全角破折号、+86、分机/转接/ext（phone 规范化且保留转接信息） 只有城市，没有省份的地址 只有某个区，但没有城市、省份的地址 教程 注意：为了方便起见，建议直接使用阿里云教程内的使用环境(老鸟略过)，可领取试用点后可以使用9个小时的环境，主要是已经安装好了 CUDA 等驱动，显卡是A10，内存也给得挺大的。\n下载训练数据 1 2 3 4 mkdir /root/qwen-0.6b cd /root/qwen-0.6b \u0026amp;\u0026amp; \\ # 下载训练数据 train.jsonl curl -f -o train.jsonl \u0026#34;https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250610/azvmpb/train_with_system.jsonl\u0026#34; 安装依赖 ms-swift 魔搭社区提供的训练框架，支持模型的下载、微调和权重合并，极大简化了微调流程。 vllm 用于部署微调后的模型，支持高性能推理服务，不仅方便验证微调效果，还可用于生成 API，供业务方直接调用。 1 pip3 install vllm==0.9.0.1 ms-swift==3.5.0 ps: 建议分开安装，不然会卡很久。\n1 2 pip3 install vllm==0.9.0.1 pip3 install ms-swift==3.5.0 模型微调 1 2 3 4 5 cd /root/qwen-0.6b \u0026amp;\u0026amp; \\ # 下载微调脚本 sft.sh curl -f -o sft.sh \u0026#34;https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250623/cggwpz/sft.sh\u0026#34; \u0026amp;\u0026amp; \\ # 执行微调脚本 bash sft.sh 微调的核心代码为:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 swift sft \\ --model Qwen/Qwen3-0.6B \\ --train_type lora \\ --dataset \u0026#39;train.jsonl\u0026#39; \\ --torch_dtype bfloat16 \\ --num_train_epochs 10 \\ --per_device_train_batch_size 20 \\ --per_device_eval_batch_size 20 \\ --learning_rate 1e-4 \\ --lora_rank 8 \\ --lora_alpha 32 \\ --target_modules all-linear \\ --gradient_accumulation_steps 16 \\ --save_steps 1 \\ --save_total_limit 2 \\ --logging_steps 2 \\ --max_length 2048 \\ --output_dir output \\ --warmup_ratio 0.05 \\ --dataloader_num_workers 4 会自动下载 Qwen3-0.6B，我本地用的3080 12G跑的，大概在10分钟的样子。 根据脚本内容，训练完成后，会合并LoRA权重,生成合并后模型在output/v0-xxx-xxx/checkpoint-50-merged目录下。\n教程内容:\n在output/v0-xxx-xxx路径下有 images 文件夹，打开 train_loss.png（反映训练集损失） 与 eval_loss.png（反映验证集损失），根据损失值的变化趋势初步判断当前模型的训练效果：\n在结束训练前 train_loss 与 eval_loss 仍有下降趋势（欠拟合） 可以增加 num_train_epochs（训练轮次，与训练深度正相关） 参数，或适当增大 lora_rank（低秩矩阵的秩，秩越大，模型能表达更复杂的任务，但更容易过度训练）的值后再进行训练，加大模型的对训练数据的拟合程度；\n在结束训练前 train_loss 持续下降，eval_loss 开始变大（过拟合） 可以减少 num_train_epochs 参数，或适当减小lora_rank的值后再进行训练，防止模型过度训练；\n在结束训练前 train_loss 与 eval_loss 均处于平稳状态（良好拟合） 模型处于该状态时，您可以进行后续步骤。本方案的 train_loss 与 eval_loss 变化如下表所示：\n验证微调后模型效果(可选) 1 2 3 4 5 6 # 进入 /root 目录 cd /root/qwen-0.6b \u0026amp;\u0026amp; \\ # 下载并执行验证脚本 curl -o evaluate.py \u0026#34;https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250612/bzszyc/evaluate.py\u0026#34; \u0026amp;\u0026amp; \\ curl -o evaluate.sh \u0026#34;https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250612/xtgxql/evaluate.sh\u0026#34; \u0026amp;\u0026amp; \\ bash evaluate.sh 部署为 API 服务 1 2 3 4 # 下载部署脚本 deploy.sh curl -o deploy.sh \u0026#34;https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250613/hbojjv/deploy.sh\u0026#34; \u0026amp;\u0026amp; \\ # 后台运行部署脚本 bash deploy.sh 调用方式 经过我测试，温度设置为 0 ，TOP P设置为 1 好一点。\n1、curl Authorization需要输入Token 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 curl --location \u0026#39;http://localhost:8000/v1/chat/completions\u0026#39; \\ --header \u0026#39;Authorization: Bearer TOKEN\u0026#39; \\ --header \u0026#39;Content-Type: application/json\u0026#39; \\ --data \u0026#39;{ \u0026#34;model\u0026#34;: \u0026#34;Qwen3-0.6B-SFT\u0026#34;, \u0026#34;messages\u0026#34;: [ { \u0026#34;role\u0026#34;: \u0026#34;system\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;你是一个专业的信息抽取助手，专门负责从中文文本中提取收件人的JSON信息，包含的Key有province（省份）、city（城市名称）、district（区县名称）、specific_location（街道、门牌号、小区、楼栋等详细信息）、name（收件人姓名）、phone（联系电话）、postal_code(邮编)、remark(备注)。必须遵守的规则:1、如果用户输入的文本没有明确 province/city/district/name，则对应字段输出空字符串，不准编造。2、remark不允许出现 province/city/district/name/specific_location 字段内的内容\u0026#34; }, { \u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;西安，长安区，郭杜街道，樱花一路，茅坡新城，6号楼2单元 301室，联系人：周杰，电话：18666667777 (备用：13588889999)\u0026#34; } ], \u0026#34;chat_template_kwargs\u0026#34;: { \u0026#34;enable_thinking\u0026#34;: false }, \u0026#34;guided_json\u0026#34;: { \u0026#34;title\u0026#34;: \u0026#34;Labels\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;object\u0026#34;, \u0026#34;required\u0026#34;: [\u0026#34;province\u0026#34;, \u0026#34;city\u0026#34;, \u0026#34;district\u0026#34;, \u0026#34;specific_location\u0026#34;, \u0026#34;name\u0026#34;, \u0026#34;phone\u0026#34;], \u0026#34;properties\u0026#34;: { \u0026#34;province\u0026#34;: { \u0026#34;title\u0026#34;: \u0026#34;Province\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;string\u0026#34; }, \u0026#34;city\u0026#34;: { \u0026#34;title\u0026#34;: \u0026#34;City\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;string\u0026#34; }, \u0026#34;district\u0026#34;: { \u0026#34;title\u0026#34;: \u0026#34;District\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;string\u0026#34; }, \u0026#34;specific_location\u0026#34;: { \u0026#34;title\u0026#34;: \u0026#34;Specific Location\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;string\u0026#34; }, \u0026#34;name\u0026#34;: { \u0026#34;title\u0026#34;: \u0026#34;Name\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;string\u0026#34; }, \u0026#34;phone\u0026#34;: { \u0026#34;title\u0026#34;: \u0026#34;Phone\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;string\u0026#34; }, \u0026#34;remark\u0026#34;: { \u0026#34;title\u0026#34;: \u0026#34;Remark\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;string\u0026#34; } } } }\u0026#39; 2、Chatbox客户端 添加模型提供方 新会话 总结 对于识别效果，个人感官如果总分给10分，我给8分，可能是0.6B参数量比较小，或者是训练样本的问题，对于 行政冲突、功能区映射与定位、复杂纠错与翻译，处理还是不行，而且还是建立在我重新使用新样本微调的情况下。\n自带的样本微调出来只能给到6分左右。但处理常见的地址还是没有问题的。\n其次未做 字段提取准确率、召回率、错误率 量化指标，也未对比原大模型（GLM4.7）的效果。\nPS：从目前的学习体验来看，蒸馏的整体流程和深度学习模型训练其实有不少相似之处。基本思路都是基于一批样本数据进行训练，通过不断迭代和微调来优化模型效果，并结合召回率、准确率等指标对模型性能进行评估，然后再根据评估结果继续调整训练策略或模型结构。从实践角度来看，本质上也是一个“数据 → 训练 → 评估 → 调整”的循环过程，只是蒸馏更多是在已有模型能力的基础上进行知识迁移和压缩。\n2026-03-04 更新 针对以上行政冲突等问题，我重新利用GLM4.7生成了2.8万条样本数据，其中包含\n行政区冲突样本 缺失补全样本 定位，新增了字段 zone (功能区)， 多地址/冲突 非“路号”型地址：村镇组/队/屯/号；市场档口/铺位/摊位；或学校/医院/园区内部楼宇（楼/座/科室/院区等） 数字混淆：取件码/门禁码 等 多号码/分机 英文/拼音片段 行政区错别字 偏远地区 行政区缩写与别称 模糊POI与硬门牌 路名干扰 不再将 功能区 放入 remark 字段中，单独放入 zone 字段。但最好还是模型后置省市区数据库做校验。\n训练参数重新调整为\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 swift sft \\ --model Qwen/Qwen3-0.6B \\ --train_type lora \\ --dataset \u0026#39;train.jsonl\u0026#39; \\ --torch_dtype bfloat16 \\ --num_train_epochs 2 \\ --per_device_train_batch_size 24 \\ --per_device_eval_batch_size 24 \\ --learning_rate 5e-5 \\ --lora_rank 16 \\ --lora_alpha 32 \\ --target_modules all-linear \\ --gradient_accumulation_steps 4 \\ --save_steps 100 \\ --save_total_limit 3 \\ --logging_steps 10 \\ --max_length 512 \\ --output_dir output \\ --warmup_ratio 0.05 \\ --dataloader_num_workers 4; 目前发现不足: 1 2 3 4 5 6 7 1、 把地标当 name。 如： 内蒙古自治区呼和浩特市赛罕区敕勒川大街1号内蒙古自治区政府旁,\u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;内蒙古自治区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;呼和浩特市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;赛罕区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;敕勒川大街1号\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;内蒙古自治区政府旁\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;postal_code\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;}\u0026#34; 2、行政区规范仍不稳定。如 广东省深圳市深汕特别合作区 输出 district=\u0026#34;南山区\u0026#34;。 3、单元号符号丢失。如 2号楼-1单元 802 输出：2号楼1单元802（丢了 -） 4、地址片段粘连。观日路18号 B10 5层 → 输出 观日路18号B105层（B10 和 5层粘一起） 还是需要针对性生成200条样本左右，基于新的模型再次蒸馏进行纠正，这一块后续再做。\n优点: 对于一般的正常地址已经能做到不出错 抗干扰与清洗能力 复杂的逻辑拆分,对 zone（功能区/开发区）和 remark（备注）的拆分非常灵动。比如能把“与海德三道交汇处”准确放入备注，把“高新区”和“武侯区”分别归类。 行政区划补全与规范,能将“新疆”自动扩写为“新疆维吾尔自治区”。 测试地址(虚拟，有难度的情况)(忽略json格式)： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 原文：浙江省舟山市普陀区朱家尖街道东沙路100号 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;浙江省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;舟山市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;普陀区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;朱家尖街道东沙路100号\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;postal_code\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;}\u0026#34; 原文：山东省潍坊市寿光市圣城街道圣阳街与幸福路交叉口 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;山东省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;潍坊市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;寿光市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;圣城街道圣阳街与幸福路交叉口\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;postal_code\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;}\u0026#34; 原文：河南新乡市长垣市蒲西街道蒲城大道1号行政中心 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;河南省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;新乡市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;长垣市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;蒲西街道蒲城大道1号行政中心\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;postal_code\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;}\u0026#34; 原文：湖北省神农架林区木鱼镇木鱼路1号神农架游客中心 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;湖北省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;神农架林区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;木鱼镇木鱼路1号神农架游客中心\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;postal_code\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;}\u0026#34; 原文：广东省深圳市深汕特别合作区鹅埠镇创新大道1号 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;广东省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;深圳市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;南山区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;深汕特别合作区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;鹅埠镇创新大道1号\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;postal_code\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;}\u0026#34; 原文：上海 浦东 张江高科(中区) 科苑路捌拾捌号 3#楼501 张三/前台收 13800138000（备注：别按门铃，电话可能打不通） 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;上海市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;上海市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;浦东新区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;张江高科(中区)\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;科苑路捌拾捌号3#楼501\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;张三\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;13800138000\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;前台收；别按门铃，电话可能打不通\u0026#34;\u0026#34;}\u0026#34; 原文：北京市海淀区 上地十街10号院（辉煌国际）2号楼-1单元 802，李四 186-0000-1234；备用：010-6299 7788（快递别放驿站） 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;北京市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;北京市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;海淀区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;上地十街10号院辉煌国际2号楼1单元802\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;李四\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;18600001234\u0026#34;\u0026#34;, \u0026#34;\u0026#34;postal_code\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;备用号:010-62997788；快递别放驿站\u0026#34;\u0026#34;}\u0026#34; 原文：广东省深圳市南山粤海街道 科技园（南区）科苑南路2666号 中国华润大厦T2 23F 2306室 收件：王五 13900001111 备注：到前台说“会议资料” 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;广东省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;深圳市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;南山区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;科技园（南区）\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;科苑南路2666号中国华润大厦T2 23F 2306室\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;王五\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;13900001111\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;到前台说“会议资料”\u0026#34;\u0026#34;}\u0026#34; 原文：浙江杭州 余杭区（未来科技城）文一西路 969号 阿里巴巴西溪园区 3期 D区 5号楼 3-201 赵* 15100002222（门口保安不让进） 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;浙江省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;杭州市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;余杭区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;未来科技城；阿里巴巴西溪园区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;文一西路969号3期D区5号楼3-201\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;赵*\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;15100002222\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;门口保安不让进\u0026#34;\u0026#34;}\u0026#34; 原文：重庆 渝北 回兴（两路）金开大道 1881 号 融科金开中心 1栋 19-7 收：陈晨 133 3333 3333 备注：周末别送 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;重庆市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;重庆市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;渝北区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;金开大道1881号融科金开中心1栋19-7\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;陈晨\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;13333333333\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;周末别送\u0026#34;\u0026#34;}\u0026#34; 原文：江苏省南京市鼓楼区 中山北路 8O 号（注意是字母O不是零）德基广场二期 A座 1608，周先生 18000000000（发顺丰） 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;江苏省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;南京市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;鼓楼区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;中山北路8O号德基广场二期A座1608\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;周先生\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;18000000000\u0026#34;\u0026#34;, \u0026#34;\u0026#34;postal_code\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;发顺丰\u0026#34;\u0026#34;}\u0026#34; 原文：四川成都 高新区（其实是武侯？不确定）天府二街 138号 腾讯大厦 B座 12层 1203 张老师 177-7777-7777 备注：到了打座机 028-88886666 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;四川省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;成都市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;高新区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;天府二街138号腾讯大厦B座12层1203\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;张老师\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;17777777777\u0026#34;\u0026#34;, \u0026#34;\u0026#34;postal_code\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;备注：到了打座机028-88886666\u0026#34;\u0026#34;}\u0026#34; 原文：湖北武汉 江岸区 台北一路 9号 云林街坊? 4栋2单元502（原502现504） 收件人：刘女士 15200003333（别写“台北路”会丢件） 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;湖北省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;武汉市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;江岸区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;台北一路9号云林街坊4栋2单元502\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;刘女士\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;15200003333\u0026#34;\u0026#34;, \u0026#34;\u0026#34;postal_code\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;原502现504;别写“台北路”会丢件\u0026#34;\u0026#34;}\u0026#34; 原文：陕西西安 雁塔 曲江新区（功能区）芙蓉西路 99号 曲江大悦城 写字楼 1号楼 1402 杨洋 18700004444 备注：停车场入口旁 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;陕西省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;西安市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;雁塔区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;曲江新区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;芙蓉西路99号曲江大悦城写字楼1号楼1402\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;杨洋\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;18700004444\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;停车场入口旁\u0026#34;\u0026#34;}\u0026#34; 原文：福建 厦门 思明区 软件园二期 观日路 18号 B10 5层（前台转） 收：林- 13600005555（上午送） 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;福建省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;厦门市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;思明区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;软件园二期\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;观日路18号B105层\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;林\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;13600005555\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;前台转；上午送\u0026#34;\u0026#34;}\u0026#34; 原文：山东省青岛市 市北区（原四方）黑龙江南路 2号 万科中心 A座 1301，收件：孙悟空 17000006666（公司名别写，写了会被退） 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;山东省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;青岛市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;市北区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;黑龙江南路2号万科中心A座1301\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;孙悟空\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;17000006666\u0026#34;\u0026#34;, \u0026#34;\u0026#34;postal_code\u0026#34;\u0026#34;: \u0026#34;\u0026#34;\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;公司名别写，写了会被退\u0026#34;\u0026#34;}\u0026#34; 原文：河南郑州 郑东新区（功能区）商务外环路 5号 国际金融中心 IFC 2号楼 9-903 赵六 15900007777 备注：门牌有两个，以“2号楼”为准 解析结果: \u0026#34;{\u0026#34;\u0026#34;province\u0026#34;\u0026#34;: \u0026#34;\u0026#34;河南省\u0026#34;\u0026#34;, \u0026#34;\u0026#34;city\u0026#34;\u0026#34;: \u0026#34;\u0026#34;郑州市\u0026#34;\u0026#34;, \u0026#34;\u0026#34;district\u0026#34;\u0026#34;: \u0026#34;\u0026#34;郑东新区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;zone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;郑东新区\u0026#34;\u0026#34;, \u0026#34;\u0026#34;specific_location\u0026#34;\u0026#34;: \u0026#34;\u0026#34;商务外环路5号国际金融中心IFC2号楼9-903\u0026#34;\u0026#34;, \u0026#34;\u0026#34;name\u0026#34;\u0026#34;: \u0026#34;\u0026#34;赵六\u0026#34;\u0026#34;, \u0026#34;\u0026#34;phone\u0026#34;\u0026#34;: \u0026#34;\u0026#34;15900007777\u0026#34;\u0026#34;, \u0026#34;\u0026#34;remark\u0026#34;\u0026#34;: \u0026#34;\u0026#34;门牌有两个，以“2号楼”为准\u0026#34;\u0026#34;}\u0026#34; 本机微调过程(可忽略) 这里记录一下我自己使用本机训练的过程。\nps: 后续涉及到执行python命令，请自行按照自己的python 环境管理器运行，例如我使用的uv，那么执行python前加一个前缀uv / uv run等。\n1 2 3 4 5 6 运行环境：ubuntu 20.04.6(WSL2) 显卡: NVIDIA GeForce RTX 3080 12G CUDA Version: 12.9 Driver Version: 576.88 NVIDIA-SMI 576.88 python 环境管理器: uv 安装uv 1 curl -LsSf https://astral.sh/uv/install.sh | sh 安装完成后，可用以下命令验证安装\n1 uv --version 创建虚拟环境\n1 2 mkdir qwen-0.6b \u0026amp;\u0026amp; cd qwen-0.6b uv venv --python 3.12.7 默认会在当前目录创建 .venv 虚拟环境。\n安装vllm 官方版本 根据自己的CUDA版本来。\n1 uv pip install vllm==0.15.1 --extra-index-url https://wheels.vllm.ai/0.15.1/cu129 --extra-index-url https://download.pytorch.org/whl/cu129 --index-strategy unsafe-best-match 更多安装教程，可自行搜索(VLLM 部署的一些细节，关于CUDA对应版本的问题)\n安装ms-swift 1 uv pip install ms-swift==3.5.0 脚本改动 将sft.sh、deploy.sh 执行的python脚本改为 uv 环境运行。如： sft.sh\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 #!/bin/bash # ============================================================================= # Qwen3 0.6B 模型LoRA微调脚本 # # 功能： # 1. 自动下载Qwen3-0.6B模型 # 2. 使用物流填单数据集进行LoRA微调 # 3. 保存微调后的权重 # 4. 合并LoRA权重 # ============================================================================= if CUDA_VISIBLE_DEVICES=0 \\ uv run swift sft \\ --model Qwen/Qwen3-0.6B \\ --train_type lora \\ --dataset \u0026#39;train.jsonl\u0026#39; \\ --torch_dtype bfloat16 \\ --num_train_epochs 10 \\ --per_device_train_batch_size 20 \\ --per_device_eval_batch_size 20 \\ --learning_rate 1e-4 \\ --lora_rank 8 \\ --lora_alpha 32 \\ --target_modules all-linear \\ --gradient_accumulation_steps 16 \\ --save_steps 1 \\ --save_total_limit 2 \\ --logging_steps 2 \\ --max_length 2048 \\ --output_dir output \\ --warmup_ratio 0.05 \\ --dataloader_num_workers 4; then # 检查输出目录是否存在checkpoint echo \u0026#34;检查训练结果...\u0026#34; if [ -d \u0026#34;output\u0026#34; ] \u0026amp;\u0026amp; [ \u0026#34;$(find output -name \u0026#34;checkpoint-*\u0026#34; -type d | wc -l)\u0026#34; -gt 0 ]; then echo \u0026#34;✓ 找到训练checkpoint文件\u0026#34; echo \u0026#34;\u0026#34; echo \u0026#34;✓ 模型微调完成！\u0026#34; echo \u0026#34;输出目录: output/\u0026#34; else echo \u0026#34;✗ 未找到训练checkpoint文件\u0026#34; echo \u0026#34;训练可能未成功完成\u0026#34; exit 1 fi else echo \u0026#34;\u0026#34; echo \u0026#34;✗ 模型微调失败！\u0026#34; echo \u0026#34;请检查错误信息\u0026#34; exit 1 fi echo \u0026#34;检测最新的checkpoint路径...\u0026#34; LATEST_CHECKPOINT=$(find output -name \u0026#34;checkpoint-*\u0026#34; -type d | sort -V | tail -1) if [ -z \u0026#34;$LATEST_CHECKPOINT\u0026#34; ]; then echo \u0026#34;✗ 错误: 未找到checkpoint文件\u0026#34; echo \u0026#34;请确保已完成模型微调，并且output目录中存在checkpoint文件\u0026#34; exit 1 else echo \u0026#34;✓ 找到checkpoint: $LATEST_CHECKPOINT\u0026#34; fi echo \u0026#34;开始合并LoRA权重...\u0026#34; # 执行权重合并 # --ckpt_dir: checkpoint目录路径（需要根据实际情况修改） # --merge_lora: 启用LoRA权重合并 if uv run swift export \\ --ckpt_dir \u0026#34;$LATEST_CHECKPOINT\u0026#34; \\ --merge_lora true; then echo \u0026#34;✓ swift export 命令执行成功\u0026#34; else echo \u0026#34;✗ swift export 命令执行失败\u0026#34; exit 1 fi # 检查合并是否成功 echo \u0026#34;检查合并结果...\u0026#34; MERGED_DIR=\u0026#34;${LATEST_CHECKPOINT}-merged\u0026#34; if [ -d \u0026#34;$MERGED_DIR\u0026#34; ]; then echo \u0026#34;✓ 合并目录创建成功: $MERGED_DIR\u0026#34; echo \u0026#34;\u0026#34; echo \u0026#34;✓ LoRA权重合并完成！\u0026#34; echo \u0026#34;合并后的模型路径: $MERGED_DIR\u0026#34; else echo \u0026#34;✗ 权重合并失败，未找到合并目录: $MERGED_DIR\u0026#34; echo \u0026#34;请检查错误信息\u0026#34; exit 1 fi deploy.sh\n此处我固定了API KEY。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 #!/bin/bash # ============================================================================= # vLLM API服务部署脚本 # # 功能： # 使用vLLM部署OpenAI兼容的API服务 # # 可自定义参数： # - --model: 模型路径（需要根据merge.sh的输出修改） # - --host: 服务监听地址（0.0.0.0表示所有网络接口） # - --port: 服务端口（默认8000） # - --api-key: API访问密钥（每次运行时自动生成） # - --gpu-memory-utilization: GPU显存使用率（0.8表示80%） # - --max-model-len: 最大模型长度 # # 安全提示： # 1. API密钥每次启动时自动生成 # 2. 如果在生产环境使用，建议配置防火墙规则 # ============================================================================= # 生成随机API密钥 echo \u0026#34;生成API密钥...\u0026#34; if API_KEY=\u0026#34;sk-$(openssl rand -hex 24)\u0026#34;; then echo \u0026#34;✓ API密钥生成成功\u0026#34; else echo \u0026#34;✗ API密钥生成失败\u0026#34; exit 1 fi API_KEY=\u0026#34;sk-23faf2fd47f91300d7a6c6656128e7b53f036408195acc77\u0026#34; # 自动检测最新的合并模型路径 echo \u0026#34;检测合并模型路径...\u0026#34; MERGED_MODEL=$(find output -name \u0026#34;*-merged\u0026#34; -type d | sort -V | tail -1) if [ -z \u0026#34;$MERGED_MODEL\u0026#34; ]; then echo \u0026#34;✗ 错误: 未找到合并后的模型\u0026#34; echo \u0026#34;请确保已运行merge.sh并成功合并LoRA权重\u0026#34; echo \u0026#34;或者手动指定模型路径\u0026#34; exit 1 else echo \u0026#34;✓ 找到合并模型: $MERGED_MODEL\u0026#34; fi echo \u0026#34;\u0026#34; echo \u0026#34;✓ 所有检查通过，启动vLLM API服务...\u0026#34; echo \u0026#34;\u0026#34; echo \u0026#34;服务配置：\u0026#34; echo \u0026#34;- 模型路径: $MERGED_MODEL\u0026#34; echo \u0026#34;- 监听地址: 0.0.0.0:8000\u0026#34; echo \u0026#34;- API密钥: $API_KEY\u0026#34; echo \u0026#34;- 模型名称: Qwen3-0.6B-SFT\u0026#34; echo \u0026#34;\u0026#34; echo \u0026#34;请保存上面的API密钥，用于客户端连接！\u0026#34; echo \u0026#34;\u0026#34; # 启动vLLM API服务器 echo \u0026#34;正在后台启动vLLM API服务器...\u0026#34; # 启动服务器并获取进程ID uv run python -m vllm.entrypoints.openai.api_server \\ --model \u0026#34;$MERGED_MODEL\u0026#34; \\ --host 0.0.0.0 \\ --port 8000 \\ --served-model-name Qwen3-0.6B-SFT \\ --trust-remote-code \\ --gpu-memory-utilization 0.8 \\ --max-model-len 2048 \\ --api-key \u0026#34;$API_KEY\u0026#34; \u0026gt; vllm.log 2\u0026gt;\u0026amp;1 \u0026amp; VLLM_PID=$! # 等待服务启动 echo \u0026#34;等待服务启动中...\u0026#34; # 循环检查服务是否启动成功 MAX_WAIT=120 # 最大等待2分钟 WAIT_TIME=0 SERVICE_READY=false while [ $WAIT_TIME -lt $MAX_WAIT ]; do if kill -0 $VLLM_PID 2\u0026gt;/dev/null; then # 进程存在，检查API是否可用 if curl -s http://localhost:8000/health \u0026gt; /dev/null 2\u0026gt;\u0026amp;1; then SERVICE_READY=true break fi else echo \u0026#34;✗ vLLM进程意外停止\u0026#34; break fi echo \u0026#34;等待中... ($WAIT_TIME/$MAX_WAIT 秒)\u0026#34; sleep 5 WAIT_TIME=$((WAIT_TIME + 5)) done # 检查服务是否正常运行 if [ \u0026#34;$SERVICE_READY\u0026#34; = true ]; then echo \u0026#34;\u0026#34; echo \u0026#34;✓ API服务启动成功！\u0026#34; echo \u0026#34;✓ 服务进程ID: $VLLM_PID\u0026#34; echo \u0026#34;✓ 日志文件: vllm.log\u0026#34; # 注意事项说明 echo \u0026#34;\u0026#34; echo \u0026#34;重要提示：\u0026#34; echo \u0026#34;1. API密钥: $API_KEY\u0026#34; echo \u0026#34;2. 服务地址: http://0.0.0.0:8000\u0026#34; echo \u0026#34;3. 日志查看: tail -f vllm.log\u0026#34; echo \u0026#34;4. 停止服务: kill $VLLM_PID\u0026#34; echo \u0026#34;5. 如需外网访问，请配置防火墙规则\u0026#34; echo \u0026#34;\u0026#34; echo \u0026#34;服务部署完成！按 Ctrl+C 停止服务。\u0026#34; # 示例：保存API密钥到文件 echo \u0026#34;$API_KEY\u0026#34; \u0026gt; api_key.txt echo \u0026#34;✓ API密钥已保存到 api_key.txt\u0026#34; # 示例：检查服务状态 echo \u0026#34;\u0026#34; echo \u0026#34;服务状态检查：\u0026#34; if curl -s http://localhost:8000/health \u0026gt; /dev/null 2\u0026gt;\u0026amp;1; then echo \u0026#34;✓ API服务健康检查通过\u0026#34; else echo \u0026#34;⚠ API服务可能还在启动中，请稍后检查\u0026#34; fi # 信号处理函数 cleanup() { echo \u0026#34;\u0026#34; echo \u0026#34;正在停止vLLM服务...\u0026#34; kill $VLLM_PID 2\u0026gt;/dev/null wait $VLLM_PID 2\u0026gt;/dev/null echo \u0026#34;✓ 服务已停止\u0026#34; exit 0 } # 注册信号处理 trap cleanup SIGINT SIGTERM echo \u0026#34;\u0026#34; echo \u0026#34;服务正在运行中... （使用 Ctrl+C 停止）\u0026#34; echo \u0026#34;============================================\u0026#34; # 保持脚本运行，等待用户中断 while true; do if ! kill -0 $VLLM_PID 2\u0026gt;/dev/null; then echo \u0026#34;✗ vLLM服务意外停止，退出...\u0026#34; exit 1 fi sleep 10 done else echo \u0026#34;\u0026#34; echo \u0026#34;✗ API服务启动失败\u0026#34; echo \u0026#34;请检查日志文件: vllm.log\u0026#34; exit 1 fi ","permalink":"https://blog.curlc.com/posts/fine-tuning-small-model-distillation/","summary":"\u003cp\u003e无意间，看见阿里云提供了针对 \u003cem\u003e\u003cstrong\u003eQwen3-0.6B\u003c/strong\u003e\u003c/em\u003e 的蒸馏教程，本文章本质上是跟着阿里云提供的教程学习微调过程，\u003ca href=\"https://www.aliyun.com/solution/tech-solution/qwen3-distill\"\u003e官方教程地址\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e借用下阿里云教程的介绍：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e大参数模型效果好，但成本高、响应慢。为了在保障效果的同时提升推理速度、降低成本，可首先借助大参数模型完成目标任务的数据生成，并使用这些数据微调小参数模型，使其在特定任务中达到接近大参数模型的表现，这一过程也被称为模型蒸馏。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e本方案将以从一句话中提取结构化信息（如收件人、地址、电话）为例，演示如何通过模型蒸馏，让 Qwen3-0.6B 模型在此任务上达到大参数模型的表现。\u003c/p\u003e\n\u003c/blockquote\u003e","title":"记一次小模型微调/蒸馏学习(Qwen3-0.6B 从收货地址中提取结构化信息)"},{"content":"最近我重新整理了一下自己电脑上的 Git SSH 配置，顺手也想清楚了一个以前一直有点纠结的问题：\n私钥到底要不要设置密码？\n不设密码，git pull、git push 都很顺手；\n设了密码，VSCode 或 IDEA 里又经常弹窗让输入，挺烦。\n但想了想，私钥毕竟就是自己的身份凭证。\n如果没有密码保护，哪天电脑中毒、文件被拷走，别人拿到这把 key，基本就能直接冒充访问仓库。\n所以我的结论是：\n私钥应该设置密码，但不应该每次都手动输入。\n解决办法就是用 ssh-agent。\nssh-agent 是什么？ 可以简单理解成一个本地的“钥匙管家”。\n第一次使用私钥时，输入一次密码。\n之后 ssh-agent 会把解锁后的密钥临时缓存起来。\n这样私钥文件本身仍然是加密的，但平时 git pull、git push 不会一直打断。\nWindows 上怎么配置？ Windows 10 / 11 已经自带 OpenSSH 和 ssh-agent。\n先确认 SSH 可用：\n1 ssh -V 查看 ssh-agent 服务状态\n1 Get-Service ssh-agent 然后用管理员 PowerShell 启动 ssh-agent：\n1 2 Set-Service -Name ssh-agent -StartupType Automatic Start-Service ssh-agent 再把私钥加入 agent：\n1 ssh-add $env:USERPROFILE\\.ssh\\id_ed25519 第一次会输入私钥密码。 之后可以检查一下：\n1 ssh-add -l 能看到 key 信息，就说明已经缓存成功了。\nVSCode 和 IDEA 配置 VSCode 通常不用特别配置，但建议统一使用 Windows 自带的 OpenSSH：\n1 git config --global core.sshCommand \u0026#34;C:/Windows/System32/OpenSSH/ssh.exe\u0026#34; 旧版本 IDEA 里可能有 SSH executable 选项，可以选择 Native；如果的版本里没有这个选项，就直接通过 git config --global core.sshCommand 让 Git 使用 Windows 自带的 OpenSSH。\n","permalink":"https://blog.curlc.com/posts/windows-git-ssh-passphrase/","summary":"\u003cp\u003e最近我重新整理了一下自己电脑上的 Git SSH 配置，顺手也想清楚了一个以前一直有点纠结的问题：\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e私钥到底要不要设置密码？\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e不设密码，\u003ccode\u003egit pull\u003c/code\u003e、\u003ccode\u003egit push\u003c/code\u003e 都很顺手；\u003cbr\u003e\n设了密码，VSCode 或 IDEA 里又经常弹窗让输入，挺烦。\u003c/p\u003e","title":"Windows 上 Git SSH 私钥要不要设置密码？"},{"content":"这篇文章和使用 GitHub Actions 不同的是：\n代码托管在 GitHub 私有仓库 CI/CD 在自己服务器执行 不想使用 GitHub Actions 分钟数 比 Jenkins / GitLab 更轻量 另一篇文章 : GitHub Actions + Hugo 构建 + rsync/SSH 部署到服务器\n整体架构：\n1 2 3 4 5 6 7 8 9 GitHub Push ↓ GitHub Webhook ↓ Woodpecker CI ↓ Docker 中构建 Hugo ↓ rsync 部署到服务器 为什么选择 Woodpecker Woodpecker 是 Drone 的社区 Fork，特点：\n轻量 Docker-first YAML 简单 支持 GitHub / Gitea / Forgejo 非常适合 Hugo、静态博客、小型项目 资源占用通常只有几十 MB。\nGitHub Actions → Woodpecker 的区别 GitHub Actions：\n1 uses: Woodpecker：\n1 image: Woodpecker 的每个步骤本质上是 Docker 容器。\nSecret 注入方式 GitHub Actions：\n1 ${{ secrets.SERVER_HOST }} Woodpecker：\n1 2 3 4 5 6 environment: SERVER_HOST: from_secret: server_host #读取 secret(server_host) #注入环境变量 SERVER_HOST 安装 Docker 服务器已经安装了则跳过\n服务器：\n1 2 curl -fsSL https://get.docker.com | sh sudo apt install docker-compose-plugin -y 验证：\n1 docker compose version 创建 GitHub OAuth App 创建路径：\n1 2 3 4 5 6 GitHub → 鼠标移动到头像 → Settings → Developer settings → OAuth Apps → New OAuth App 填写：\n1 2 Homepage URL -\u0026gt; Woodpecker首页 Callback URL -\u0026gt; Woodpecker首页 创建后保存：\n1 2 Client ID Client Secret ci.example.com 更改为自己服务器的地址\n部署 Woodpecker 创建目录：\n1 2 mkdir -p /opt/woodpecker cd /opt/woodpecker 生成随机 secret，填写在 WOODPECKER_AGENT_SECRET 字段。\n1 openssl rand -hex 32 .env 1 2 3 4 5 6 7 8 9 10 11 WOODPECKER_HOST=https://ci.example.com WOODPECKER_GITHUB=true WOODPECKER_GITHUB_CLIENT=你的ClientID WOODPECKER_GITHUB_SECRET=你的ClientSecret WOODPECKER_AGENT_SECRET=随机字符串 WOODPECKER_OPEN=true WOODPECKER_ADMIN=你的GitHub用户名 创建docker-compose.yml 1 nano docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 services: woodpecker-server: image: woodpeckerci/woodpecker-server:v3 restart: always ports: - \u0026#34;8000:8000\u0026#34; volumes: - woodpecker-server-data:/var/lib/woodpecker/ environment: - WOODPECKER_OPEN=${WOODPECKER_OPEN} - WOODPECKER_HOST=${WOODPECKER_HOST} - WOODPECKER_GITHUB=${WOODPECKER_GITHUB} - WOODPECKER_GITHUB_CLIENT=${WOODPECKER_GITHUB_CLIENT} - WOODPECKER_GITHUB_SECRET=${WOODPECKER_GITHUB_SECRET} - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET} woodpecker-agent: image: woodpeckerci/woodpecker-agent:v3 restart: always command: agent depends_on: - woodpecker-server volumes: - /var/run/docker.sock:/var/run/docker.sock environment: - WOODPECKER_SERVER=woodpecker-server:9000 - WOODPECKER_AGENT_SECRET=${WOODPECKER_AGENT_SECRET} volumes: woodpecker-server-data: 启动：\n1 docker compose up -d 首次登录 打开：\n1 https://ci.example.com 使用 GitHub 登录。\n第一次登录后建议关闭开放注册：\n1 WOODPECKER_OPEN=false 然后重启容器：\n1 2 3 4 5 docker compose restart # 如果重启没有效果，可以销毁容器再启动 docker compose down docker compose up -d 激活仓库 选择自己在GitHub上的私有hugo仓库，点击启用。\nWoodpecker 会自动创建 GitHub Webhook。\nHugo 自动部署 仓库根目录创建：\n1 nano .woodpecker.yml 部署配置:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 when: - branch: - main - master event: - push clone: git: image: woodpeckerci/plugin-git settings: recursive: true steps: build: image: hugomods/hugo:0.145.0-exts commands: - hugo --minify --cleanDestinationDir deploy: image: alpine:latest environment: SERVER_HOST: from_secret: server_host SERVER_USER: from_secret: server_user SERVER_PATH: from_secret: server_path SERVER_SSH_KEY: from_secret: server_ssh_key commands: - apk add --no-cache openssh rsync - mkdir -p ~/.ssh - echo \u0026#34;$SERVER_SSH_KEY\u0026#34; \u0026gt; ~/.ssh/deploy_key - chmod 600 ~/.ssh/deploy_key - ssh-keyscan -T 10 -H \u0026#34;$SERVER_HOST\u0026#34; \u0026gt;\u0026gt; ~/.ssh/known_hosts - | rsync -rlvz --delete \\ --exclude=\u0026#39;.user.ini\u0026#39; \\ -e \u0026#34;ssh -i ~/.ssh/deploy_key\u0026#34; \\ public/ \\ \u0026#34;$SERVER_USER@$SERVER_HOST:$SERVER_PATH/\u0026#34; 配置 Secret 添加：\nName 内容 server_host 服务器 IP server_user SSH 用户 server_path 部署目录 server_ssh_key SSH 私钥 这些值怎么来的， 请查看这篇文章\n工作流程 以后只需要：\n1 git push Woodpecker 会自动：\n1 2 3 4 5 GitHub Webhook → 拉代码 → Hugo 构建 → rsync 上传 → 网站更新 ","permalink":"https://blog.curlc.com/posts/github-woodpecker-hugo-deploy/","summary":"\u003cp\u003e这篇文章和使用 \u003cstrong\u003eGitHub Actions\u003c/strong\u003e 不同的是：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e代码托管在 GitHub 私有仓库\u003c/li\u003e\n\u003cli\u003eCI/CD 在自己服务器执行\u003c/li\u003e\n\u003cli\u003e不想使用 GitHub Actions 分钟数\u003c/li\u003e\n\u003cli\u003e比 Jenkins / GitLab 更轻量\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e另一篇文章 \u003cstrong\u003e: \u003ca href=\"https://blog.curlc.com/github-actions-hugo-deploy-server/\"\u003eGitHub Actions + Hugo 构建 + rsync/SSH 部署到服务器\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e","title":"使用 GitHub + Woodpecker 实现 Hugo 自动部署"},{"content":"由于本博客之前还是手动部署，忍受一段时间后实在受不了了，还是开启了 CI/CD 日子~\n目标 实现：\n1 本地写文章 → git push 到 GitHub → GitHub Actions 自动构建 Hugo → rsync 部署到服务器 推荐结构：\n1 2 3 4 GitHub 仓库：保存 Hugo 源码 GitHub Actions：负责构建 public/ deploy 用户：负责 SSH 登录和部署 www / www-data 用户：负责运行网站服务，例如 Nginx 一、服务器准备 以 Debian / Ubuntu 为例，本文默认你已经安装了 nginx。\n1. 安装依赖 1 2 sudo apt update sudo apt install -y rsync Hugo 可以在 GitHub Actions 里构建，所以服务器不需要安装 Hugo。\n二、创建 deploy 用户 不要使用 root 部署，也不建议让 www 用户登录 SSH。\n1 sudo useradd -m -s /bin/bash deploy 如果已经有 deploy 用户，可以检查：\n1 getent passwd deploy 最后一列应该类似：\n1 /bin/bash 如果是：\n1 /usr/sbin/nologin 可以改成：\n1 sudo usermod -s /bin/bash deploy 三、网站目录权限配置 假设网站目录是：\n1 /var/www/blog 创建目录：\n1 sudo mkdir -p /var/www/blog 如果 Nginx 使用 www 用户：\n1 2 3 4 sudo usermod -aG www deploy sudo chown -R www:www /var/www/blog sudo chmod -R 775 /var/www/blog sudo find /var/www/blog -type d -exec chmod g+s {} \\; 1 2 deploy 用户：可以写入 /var/www/blog www 用户：可以读取网站文件 四、配置 SSH 密钥登录 1. 本地生成部署密钥 在本地电脑执行：\n1 ssh-keygen -t ed25519 -C \u0026#34;github-actions-hugo\u0026#34; -f github-actions-hugo 会生成：\n1 2 github-actions-hugo github-actions-hugo.pub 其中：\n1 2 github-actions-hugo 私钥，放到 GitHub Secrets github-actions-hugo.pub 公钥，放到服务器 deploy 用户 2. 把公钥注册到 deploy 用户 在服务器上执行：\n1 2 sudo mkdir -p /home/deploy/.ssh sudo cat github-actions-hugo.pub \u0026gt;\u0026gt; /home/deploy/.ssh/authorized_keys 把 github-actions-hugo.pub 的内容粘进去。\n然后修复权限：\n1 2 3 sudo chown -R deploy:deploy /home/deploy/.ssh sudo chmod 700 /home/deploy/.ssh sudo chmod 600 /home/deploy/.ssh/authorized_keys 3. 本地测试 SSH 1 ssh -i ./github-actions-hugo deploy@你的服务器IP 如果可以登录，说明密钥配置成功。\n如果报错类似：\n1 2 Permission denied 未注册用户密钥 通常是：\n1 2 3 4 5 公钥没有放到 /home/deploy/.ssh/authorized_keys authorized_keys 权限不对 .ssh 目录权限不对 文件归属不是 deploy:deploy 登录用户写错 五、配置 GitHub Secrets 进入 GitHub 仓库：\n1 Settings → Secrets and variables → Actions → New repository secret 添加：\n1 2 3 4 SERVER_HOST=你的服务器IP或域名 SERVER_USER=deploy SERVER_SSH_KEY=私钥内容 SERVER_PATH=/var/www/blog 六、添加 GitHub Actions 配置 在 Hugo 仓库中新建文件：\n1 .github/workflows/deploy.yml 内容如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 name: Deploy Hugo Blog on: push: branches: - main jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Setup Hugo uses: peaceiris/actions-hugo@v3 with: hugo-version: latest extended: true - name: Build run: hugo --minify --cleanDestinationDir - name: Setup SSH run: | mkdir -p ~/.ssh echo \u0026#34;${{ secrets.SERVER_SSH_KEY }}\u0026#34; \u0026gt; ~/.ssh/deploy_key chmod 600 ~/.ssh/deploy_key ssh-keyscan -H \u0026#34;${{ secrets.SERVER_HOST }}\u0026#34; \u0026gt;\u0026gt; ~/.ssh/known_hosts - name: Test SSH connection run: | ssh -o ConnectTimeout=20 -i ~/.ssh/deploy_key \\ ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} \\ \u0026#34;echo connected\u0026#34; - name: Deploy with rsync run: | rsync -rlvz --delete \\ -e \u0026#34;ssh -i ~/.ssh/deploy_key\u0026#34; \\ public/ \\ ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ secrets.SERVER_PATH }}/ ps: 如果是宝塔，记得在最后一栏 rsync -rlvz --delete 内添加排查.user.ini，否则会提示运行失败。\n1 2 3 4 5 - name: Deploy with rsync run: | rsync -rlvz --delete \\ --exclude=\u0026#39;.user.ini\u0026#39; \\ ....... 如果服务器 SSH 非 22 端口 假设 SSH 端口是 2222,修改 rsync：\n1 2 3 4 rsync -avz --delete \\ -e \u0026#34;ssh -i ~/.ssh/deploy_key -p 2222\u0026#34; \\ public/ \\ ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ secrets.SERVER_PATH }}/ 七、可选：限制 deploy 用户只能 rsync 到指定目录 如果不想让 deploy 用户正常登录 shell，可以使用 rrsync 限制它只能访问 /var/www/blog。\n安装：\n1 sudo apt install -y rrsync 查看路径：\n1 which rrsync 通常是：\n1 /usr/bin/rrsync 编辑 deploy 的 authorized_keys：\n1 sudo nano /home/deploy/.ssh/authorized_keys 把原来的公钥：\n1 ssh-ed25519 AAAA... github-actions-hugo 改成：\n1 command=\u0026#34;/usr/bin/rrsync /var/www/blog\u0026#34;,no-agent-forwarding,no-port-forwarding,no-pty,no-X11-forwarding ssh-ed25519 AAAA... github-actions-hugo 这样这个密钥只能用于 rsync 部署，不能打开交互式 SSH 终端。\n八、发布文章流程 以后只需要：\n1 2 3 git add . git commit -m \u0026#34;new post\u0026#34; git push origin main GitHub Actions 会自动：\n1 2 3 4 5 6 1. 拉取 Hugo 源码 2. 安装 Hugo 3. 构建 public/ 4. 通过 SSH 连接服务器 5. 用 rsync 同步 public/ 到 /var/www/blog 6. 网站自动更新 九、常见错误排查 1. SSH 超时 错误：\n1 2 ssh: connect to host xxx port 22: Connection timed out rsync error: unexplained error (code 255) 原因通常是：\n1 2 3 4 5 服务器防火墙没开放 22 云服务器安全组没开放 22 SSH 端口不是 22 SERVER_HOST 填错 服务器只允许特定 IP 登录 检查服务器防火墙：\n1 2 3 sudo ufw status sudo ufw allow 22/tcp sudo ufw reload 云服务器还要检查控制台安全组，开放：\n1 2 TCP 22 来源 0.0.0.0/0 2. 密钥未注册 / Permission denied 原因通常是 deploy 用户没有配置公钥。\n修复：\n1 2 3 4 5 sudo mkdir -p /home/deploy/.ssh sudo nano /home/deploy/.ssh/authorized_keys sudo chown -R deploy:deploy /home/deploy/.ssh sudo chmod 700 /home/deploy/.ssh sudo chmod 600 /home/deploy/.ssh/authorized_keys 3. deploy 无法写入网站目录 检查权限：\n1 ls -ld /var/www/blog 如果 Nginx 用户是 www-data：\n1 2 3 4 sudo usermod -aG www-data deploy sudo chown -R www-data:www-data /var/www/blog sudo chmod -R 775 /var/www/blog sudo find /var/www/blog -type d -exec chmod g+s {} \\; 4. Hugo 主题没有被拉下来 如果主题使用 Git submodule，确保 workflow 里有：\n1 2 with: submodules: recursive 5. Hugo 主题需要 extended 版本 很多主题需要 Hugo Extended，确保：\n1 2 with: extended: true ","permalink":"https://blog.curlc.com/github-actions-hugo-deploy-server/","summary":"\u003cp\u003e由于本博客之前还是手动部署，忍受一段时间后实在受不了了，还是开启了 CI/CD 日子~\u003c/p\u003e\n\u003ch2 id=\"目标\"\u003e目标\u003c/h2\u003e\n\u003cp\u003e实现：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e本地写文章 → git push 到 GitHub → GitHub Actions 自动构建 Hugo → rsync 部署到服务器\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"使用 GitHub Actions + rsync/SSH 实现 Hugo 自动部署"},{"content":"安装 MOX 参考：\n使用 Docker 部署 Mox Mail 邮局\n在 Linux 上使用 Docker 部署 Mox 邮件服务器时，很多人会遇到：\n1 DANE is inactive because MX records are not DNSSEC-signed. 但多数情况下，并不是域名没开启 DNSSEC，而是：\nMox 使用的 DNS 解析器没有真正进行 DNSSEC 验证。\n本文介绍如何使用 Unbound 为 Docker 中的 Mox 提供支持 DNSSEC 的 DNS 解析。\n适用环境：\n1 2 3 4 Debian / Ubuntu Docker Mox Mail Server Unbound 为什么会出现 DANE inactive Mox 启用 DANE 时，会验证：\nMX 记录 TLSA 记录 DNSSEC 签名 只有 DNSSEC 验证成功，DANE 才会生效。\nDocker 默认 DNS：\n1 127.0.0.11 只是 Docker 的内部转发器：\n不验证 DNSSEC 不返回 ad 不适合 DANE 因此即使域名已经开启 DNSSEC，Mox 仍可能提示：\n1 DANE is inactive because MX records are not DNSSEC-signed. 推荐架构 推荐：\n1 2 3 4 5 Internet ↓ Unbound ↓ Docker Mox 不要使用：\n1 2 3 Docker DNS ↓ 8.8.8.8 也不推荐：\n1 2 3 systemd-resolved ↓ Docker DNS 禁用 systemd-resolved Ubuntu / Debian 默认启用了：\n1 systemd-resolved 它会占用：\n1 127.0.0.53:53 并接管 /etc/resolv.conf。\n这会导致：\nUnbound 无法监听 53 Docker 使用错误 DNS DNSSEC 验证失效 停止并禁用：\n1 2 systemctl stop systemd-resolved systemctl disable systemd-resolved 重建 /etc/resolv.conf：\n1 2 3 mv /etc/resolv.conf /etc/resolv.conf.bak echo \u0026#34;nameserver 127.0.0.1\u0026#34; \u0026gt; /etc/resolv.conf 安装 Unbound 安装：\n1 2 apt update apt install -y unbound unbound-anchor dnsutils 确认支持 DNSSEC：\n1 unbound -V 输出中应包含：\n1 validator iterator 初始化 trust anchor 检查：\n1 ls -l /var/lib/unbound/root.key 不存在则执行：\n1 unbound-anchor -a /var/lib/unbound/root.key 配置 Unbound 创建配置：\n1 nano /etc/unbound/unbound.conf.d/mox.conf 写入：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 server: interface: 0.0.0.0 port: 53 do-ip4: yes do-ip6: yes harden-dnssec-stripped: yes qname-minimisation: yes access-control: 127.0.0.0/8 allow access-control: 172.16.0.0/12 allow access-control: 0.0.0.0/0 refuse 这里使用：\n1 0.0.0.0 是为了让 Docker 中的 Mox 能访问宿主机 Unbound。\n公网访问则通过：\n1 access-control 限制。\n启动 Unbound 检查配置：\n1 unbound-checkconf 启动：\n1 2 systemctl enable unbound systemctl restart unbound 确认 53 端口已经被 Unbound 接管：\n1 ss -lntup | grep :53 验证 DNSSEC 普通测试：\n1 dig google.com @127.0.0.1 DNSSEC 测试：\n1 dig +dnssec cloudflare.com @127.0.0.1 返回结果必须包含：\n1 ad 例如：\n1 flags: qr rd ra ad 其中：\n1 ad = Authenticated Data 最关键测试 测试故意损坏 DNSSEC 的域名：\n1 dig dnssec-failed.org @127.0.0.1 正确结果应为：\n1 SERVFAIL 如果还能解析出 IP：\n1 说明 DNSSEC 实际没有生效 让 Docker 中的 Mox 使用 Unbound docker-compose.yml：\n1 2 3 4 services: mox: dns: - 172.17.0.1 这样：\n1 2 3 4 5 Mox ↓ Unbound ↓ 递归 DNS 域名侧还需要完成什么 除了 Unbound，还需要：\n开启 DNSSEC 在 DNS 服务商后台启用 DNSSEC。\n例如：\nCloudflare Route53 HE 阿里云 腾讯云 添加 DS 记录 如果注册商没有 DS：\n1 DNSSEC 实际不会生效 配置 TLSA Mox 会自动生成：\n1 _25._tcp.mail.example.com 对应的 TLSA 记录。\n推荐检测工具 本地：\n1 delv example.com MX 1 delv _25._tcp.mail.example.com TLSA 在线：\nhttps://internet.nl https://dnsviz.net https://dane.sys4.de 总结 DANE 是否生效，关键不只是：\n1 域名开启 DNSSEC 更重要的是：\n1 2 Mox 使用的 DNS 是否真正验证 DNSSEC 因此：\nDocker 默认 DNS 不适合 DANE 建议禁用 systemd-resolved 使用支持 DNSSEC 的 resolver 推荐使用 Unbound 正确配置 DS 与 TLSA 完成后，Mox 才能真正启用：\n1 DNSSEC + DANE ","permalink":"https://blog.curlc.com/posts/debian-ubuntu-docker-mox-unbound-dnssec-dane/","summary":"\u003cp\u003e安装 MOX 参考：\u003cbr\u003e\n\u003ca href=\"https://blog.curlc.com/posts/docker-mox-mail/\"\u003e使用 Docker 部署 Mox Mail 邮局\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e在 Linux 上使用 Docker 部署 Mox 邮件服务器时，很多人会遇到：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDANE is inactive because MX records are not DNSSEC-signed.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e但多数情况下，并不是域名没开启 DNSSEC，而是：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMox 使用的 DNS 解析器没有真正进行 DNSSEC 验证。\u003c/p\u003e\n\u003c/blockquote\u003e","title":"Debian/Ubuntu + Docker + Mox 搭建Unbound，支持 DNSSEC/DANE 的 递归 DNS"},{"content":"在上一篇文章从 DNS 异常排查到使用 mosdns v5 对国外网站进行分流解析 中已经在局域网中搭建好了一个dns分流。那么，如何验证是否是否成功呢？\n可以直接访问 https://nstool.zxcvx.com/ https://nstool.netease.com/进行测试，本文章主要讲实现原理。\n思路 自己的域名解析NS记录，搭建 “权威 DNS 服务器”，监听 UDP/TCP 53 端口，实现 RFC 1035 标准的权威应答。\n其次，在使用 nslookup 或者 dig 测试时，即使你手动指定dns服务器，那么也会被抢答, 权威dns根本收不到解析消息，所以这也间接证明上一篇文章DNS是被抢答。\nps：最好不要在国内服务器搭建，毕竟有些服务商检测到你开53就会封机，不管是 权威DNS 还是 递归DNS。\n原理 DNS 探测机制：前端生成随机 token，通过加载 .domain 下的 1×1 透明 PNG 触发浏览器 DNS 查询，从权威 DNS 层捕获用户的递归解析器 IP。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 用户浏览器 │ ├─① HTTP 请求 → 服务器:8080 │ 生成随机 token，页面加载 │ ├─② 浏览器加载图片: http://\u0026lt;token\u0026gt;.dns.yourdomain.com/probe.png │ 这会触发 DNS 查询 │ ├─③ 用户的 DNS 解析器查询 \u0026lt;token\u0026gt;.dns.yourdomain.com │ → 到达 权威DNS服务器:53 │ → 记录解析器 IP + token │ └─④ 浏览器轮询 /api/info?token=\u0026lt;token\u0026gt; → 返回用户IP + DNS解析器IP + 地理信息 开源地址 故根据以上原理，我使用了 Cloude 生成了go语言的代码.\n测试地址：https://nstool.zxcvx.com/\n开源地址 https://github.com/luoye663/dns-detector\n搭建教程在Github中的 README.md 中。\n核心功能 权威 DNS 服务器：同时监听 UDP/TCP 53 端口，实现 RFC 1035 标准的权威应答（支持 A、NS、SOA、NXDOMAIN、REFUSED 响应类型） DNS 探测机制：前端生成随机 token，通过加载 \u0026lt;token\u0026gt;.domain 下的 1×1 透明 PNG 触发浏览器 DNS 查询，从权威 DNS 层捕获用户的递归解析器 IP 客户端 IP 获取：HTTP 层获取用户真实出口 IP，兼容 Nginx/CDN 反代（优先读取 X-Forwarded-For、X-Real-IP） IP 地理归属查询：使用 GeoLite2 。 Web 前端：内置单页应用，实时展示客户端 IP 与 DNS 解析器 IP 及归属地，含原理说明、流程图、探测进度条 Token 机制 唯一性：每次检测生成 12 位随机字母数字 token 一次性消费：token 被 HTTP 端读取后立即从内存删除，不可重复消费（double-check 锁防并发竞态） 自动过期：未被消费的 token 存活上限为 5 分钟，后台每 1 分钟扫描清理一次 存储位置：纯进程内存（map[string]tokenEntry），重启后丢失，不依赖外部存储 配置（全部通过环境变量） 变量 默认值 说明 DNS_DOMAIN dns.example.com 权威 DNS 区域（必填） NS_IP 1.2.3.4 服务器公网 IP（必填） WEB_PORT :8080 HTTP 监听端口 DNS_PORT :53 DNS 监听端口 LOG_LEVEL info 日志等级（debug/info/warn/error） DNS_ALLOW_ZONES 空 追加白名单区域，逗号分隔 已知局限 不支持多实例：TokenStore 在进程内存，水平扩展需替换为 Redis 重启丢失：进行中的探测 token 随进程重启消失 DoH 场景：用户开启 DNS over HTTPS 时，DNS 查询走加密通道，本工具只能捕获 DoH 提供商的出口 IP，无法得知用户真实配置的 DNS 服务器 ","permalink":"https://blog.curlc.com/local-network-dns-detection/","summary":"\u003cp\u003e在上一篇文章\u003ca href=\"https://blog.curlc.com/posts/mosdns-v5-split-dns/\"\u003e从 DNS 异常排查到使用 mosdns v5 对国外网站进行分流解析\u003c/a\u003e 中已经在局域网中搭建好了一个dns分流。那么，如何验证是否是否成功呢？\u003c/p\u003e\n\u003cp\u003e可以直接访问 \u003ca href=\"https://nstool.zxcvx.com/\"\u003ehttps://nstool.zxcvx.com/\u003c/a\u003e \u003ca href=\"https://nstool.netease.com/\"\u003ehttps://nstool.netease.com/\u003c/a\u003e进行测试，本文章主要讲实现原理。\u003c/p\u003e","title":"本地网络出口DNS检测[开源]"},{"content":"0. E5 自动订阅程序 开源地址 https://github.com/luoye663/e5\n1. 本地网络出口DNS检测 测试地址：https://nstool.zxcvx.com/\n开源地址 https://github.com/luoye663/dns-detector\n2. 使用llama.cpp量化Qwen0.6B模型CPU运行 测试地址：[Demo测试地址](https://address-parse.zxcvx.com/)\n","permalink":"https://blog.curlc.com/open-source-projects/","summary":"\u003ch2 id=\"0-e5-自动订阅程序\"\u003e0. \u003ca href=\"https://blog.curlc.com/archives/687/\"\u003eE5 自动订阅程序\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e开源地址 \u003ca href=\"https://github.com/luoye663/e5\"\u003ehttps://github.com/luoye663/e5\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"1-本地网络出口dns检测\"\u003e1. \u003ca href=\"https://blog.curlc.com/local-network-dns-detection/\"\u003e本地网络出口DNS检测\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e测试地址：\u003ca href=\"https://nstool.zxcvx.com/\"\u003ehttps://nstool.zxcvx.com/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e开源地址 \u003ca href=\"https://github.com/luoye663/dns-detector\"\u003ehttps://github.com/luoye663/dns-detector\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"2-使用llamacpp量化qwen06b模型cpu运行\"\u003e2. \u003ca href=\"https://blog.curlc.com/posts/quantize-qwen-with-llamacpp/\"\u003e使用llama.cpp量化Qwen0.6B模型CPU运行\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e测试地址：[\u003ca href=\"https://address-parse.zxcvx.com/\"\u003eDemo测试地址\u003c/a\u003e](\u003ca href=\"https://address-parse.zxcvx.com/\"\u003ehttps://address-parse.zxcvx.com/\u003c/a\u003e)\u003c/p\u003e","title":"开源项目与小工具"},{"content":"在上一篇文章记一次小模型微调/蒸馏学习(Qwen3-0.6B 从收货地址中提取结构化信息) 中已经蒸馏出数据，由于服务器没有显卡，我将模型转为GGUF，然后量化为Q5_K_M，使用llama.cpp 进行推理。\n背景 此处我打算使用 llama.cpp 的 Linux 预编译包（含 server/quantize），未自己进行编译。 如果按照上一篇文章训练出来了模型，那么一般在 output/v0-xxx-xxx文件夹内可以看见checkpoint-xxx-merged文件夹，为模型合并后的目录（含 tokenizer、config、model 权重） 由训练参数可看出，使用的是bfloat16，所以，为了在纯CPU上运行，量化为Q5_K_M(PS: 我也尝试过Q8_0 但感觉效果没有Q5_K_M好，可能是均匀量化的原因？这里还是需要一批样本数据进行验证，纯个人感受。) ps: 后续涉及到执行python命令，请自行按照自己的python 环境管理器运行，例如我使用的uv，那么执行python前加一个前缀uv / uv run等。\n1 2 3 4 5 6 运行环境：ubuntu 20.04.6(WSL2) 显卡: NVIDIA GeForce RTX 3080 12G CUDA Version: 12.9 Driver Version: 576.88 NVIDIA-SMI 576.88 python 环境管理器: uv 测试地址 Demo测试地址，这是经过 Q5_K_M 量化后的QWen3-0.6B GUFF模型，运行在纯CPU环境。限制：总并发数:8，单ip频率: 5秒/次。\n安装 llama.cpp 下载 llama.cpp 的 Linux 预编译包 GitHub Releases，下载 Ubuntu x64 (CPU) 。\n解压后给予权限：\n1 2 chmod +x llama-quantize chmod +x llama-server 将模型转为 GGUF f16母版 merged 目录是标准 HF 结构（有 model.safetensors / config.json / tokenizer.json），所以目的是为了做 f16 母版，后续量化都基于它。\n下载llama官方用于 “HF → GGUF” 的转换转换脚本convert_hf_to_gguf.py\n1 2 curl -L -o convert_hf_to_gguf.py \\ https://raw.githubusercontent.com/ggml-org/llama.cpp/master/convert_hf_to_gguf.py 安装依赖。\n1 2 3 4 5 pip install numpy safetensors sentencepiece tqdm # 如遇到 × This environment is externally managed 的错误，用虚拟环境即可解决。 # python3 -m venv myenv # source myenv/bin/activate 转为 GGUF 1 2 3 4 5 # `v6-20260305-022233/checkpoint-646-merged` 按照自己的模型目录来。 python3 convert_hf_to_gguf.py \\ output/v6-20260305-022233/checkpoint-646-merged \\ --outtype f16 \\ --outfile addr-extract.f16.gguf 量化 量化为Q5_K_M 1 ./llama-quantize addr-extract.f16.gguf addr-extract.Q5_K_M.gguf Q5_K_M 启动 REST 服务 可以使用 openai 协议的客户端测试。\n1 ./llama-server -m addr-extract.Q5_K_M.gguf --host 0.0.0.0 --port 8000 -t 8 -c 2048 自此，llama.cpp 就算运行好了，以下是文章是一些参考。\n一些参数启动组合(参考) 按照我服务器配置 CPU: E5-1630 v4,内存 64G,无gpu，目标并发10。\n1. 吞吐优先（并发 10 全接住） 1 2 3 4 5 6 7 8 9 ./llama-server \\ -m /path/model.gguf \\ --host 0.0.0.0 --port 8080 \\ --threads 8 --threads-batch 8 \\ --ctx-size 2048 --n-predict 256 \\ --parallel 10 --cont-batching \\ --cache-prompt --cache-reuse 256 \\ --temperature 0.0 --top-p 1.0 --top-k 0 \\ --api-key-file /path/keys.txt 参数 含义 常见坑 / 建议 ./llama-server 启动 HTTP 推理服务（OpenAI-like API / WebUI / slots 等） 跟 llama-cli 不同：这里要考虑并发、超时、鉴权、缓存 -m /path/model.gguf 加载 GGUF 模型文件 磁盘/文件系统会影响加载速度；生产建议配合 --mmap（默认开）与 --mlock（可选） --host 0.0.0.0 监听所有网卡地址 对外暴露服务时必用；注意防火墙/反代/鉴权 --port 8080 监听端口 跟反向代理（Nginx/Traefik）端口映射一致即可 --threads 8 生成阶段使用的 CPU 线程数（decode / token-by-token 阶段） 通常设为“物理核数”或略小；设太大→上下文切换、延迟抖动 --threads-batch 8 prefill/批处理阶段线程数（处理 prompt、并发 prefill） prefill 更吃内存带宽，线程过多会“带宽打满但不更快”；可与 --threads 不同 --ctx-size 4096 上下文长度上限（KV cache 按此分配） 越大越吃内存（并发 slots 也会乘上去）；抽取任务一般 2k~8k 足够 --n-predict 256 每次请求最多生成 256 tokens（输出上限） 服务端强烈建议设上限，避免异常请求无限生成拖垮服务 --parallel 10 slots 数：服务端同时维护多少条“独立上下文/会话槽位” 并发越高越占 KV 内存；parallel × ctx-size 是内存大头 --cont-batching 连续/动态 batching：把多个请求的 prefill/decode 合并调度以提升吞吐 并发多时很赚；但可能增加尾延迟（P99） --cache-prompt 启用 prompt caching：重复前缀（尤其 system prompt）可复用 KV 对“固定系统提示词 + 多请求”极其有效 --cache-reuse 256 复用缓存的“最小 chunk 尺寸”（越大越保守） 0 表示几乎不启用 shifting；256 表示前缀相似度高时才复用，减少误复用带来的开销 --temperature 0.0 温度=0 → 近似贪心解码（最确定） 信息抽取/结构化输出首选；创作类别用更高温度 --top-p 1.0 nucleus 关闭（不过滤） 温度已是 0 时，top-p 影响很小；这里主要表达“别再加随机性” --top-k 0 top-k 关闭 同上：温度 0 时基本无影响，但组合上更“确定性” --api-key-file /path/keys.txt 从文件加载 API keys（可多个）用于鉴权 对外服务必开；文件权限要管好 稳定性来自：temperature=0 +（可选）关闭 top-k/top-p\n吞吐来自：parallel + cont-batching\n成本控制来自：ctx-size、n-predict、prompt cache（cache-prompt/cache-reuse）\n2. 多余请求排队（限制 slot，减少争用） 1 2 3 4 5 6 7 8 ./llama-server \\ -m /path/model.gguf \\ --host 0.0.0.0 --port 8000 \\ --threads 8 --threads-batch 6 \\ --ctx-size 2048 --n-predict 256 \\ --parallel 10 --cont-batching \\ --cache-prompt --cache-reuse 256 \\ --temperature 0.0 --top-k 0 --top-p 1.0 3. GPU offload（单卡） 1 2 3 4 5 6 ./llama-server \\ -m /path/model.gguf \\ --device 0 --n-gpu-layers all \\ --ctx-size 4096 --n-predict 512 \\ --parallel 8 --cont-batching \\ --flash-attn on 把模型层 offload 到 GPU，提升吞吐/降低延迟。\n参数 含义（工程语义） 建议 --device 0 指定使用哪块 GPU（设备索引）进行 offload 多卡时要配合 --list-devices 确认索引 --n-gpu-layers all 将尽可能多的层放到 VRAM（all=全放，或放到显存顶住为止） 最关键性能参数：放得越多通常越快；显存不够就改成具体数字或用 auto --flash-attn on 强制启用 FlashAttention（GPU 上减少显存带宽压力/加速注意力） 一般 GPU 推理建议 auto/on；遇到兼容问题再 off --ctx-size 4096 上下文仍决定 KV 大小；GPU 推理时 KV 也可能占显存/或分配到主存（取决于配置） ctx 大会挤占显存，影响能 offload 的层数 --parallel 8 + --cont-batching GPU 上合并 batch 对吞吐提升非常明显 高并发 GPU 服务的“吞吐来源” 4. 强制 JSON 合法（Schema） 1 2 3 4 5 ./llama-server \\ -m /path/model.gguf \\ --json-schema-file /path/schema.json \\ --temperature 0.0 --top-k 0 --top-p 1.0 \\ --n-predict 256 这一条的目标不是速度，而是：输出结构必须合法（地址抽取最常用）。\n参数 含义 你关心的“到底约束了什么” --json-schema-file /path/schema.json 用 JSON Schema 约束解码（相当于“只允许生成符合 schema 的 token 序列”） 硬约束：字段类型、必填字段、对象结构、枚举范围等；能显著减少“漏字段/多字段/语法错” --temperature 0.0 降随机性，提升可复现与稳定 schema 已经约束结构，但温度 0 能减少内容漂移/幻觉 --top-k 0 / --top-p 1.0 进一步避免采样随机性 在结构化任务里，通常宁可确定性也不要“文采” --n-predict 256 限制输出长度 schema 也可能允许较大对象；上限能防止异常膨胀 附录 llama 启动参数详解(AI) 可使用 ./llama-server --help 查看，我当前使用的是b8204版本，命令与你当前可能不同。\n此处分为3类启动参数。\n运行/内存/设备（common）：决定吞吐、延迟、能否跑得起来 采样（sampling）：决定输出风格与稳定性 服务端/示例专用（server/example-specific）：并发、缓存、鉴权、模板等 1) Common params（性能/内存/设备） 参数 作用 默认值（你贴的） 何时需要调 常用度 -t, --threads N 生成阶段使用的 CPU 线程数 -1（自动） CPU 推理时强烈建议手动设为物理核/NUMA策略内核数；避免过度抢占 高 -tb, --threads-batch N prefill/批处理线程数（吃满内存带宽） = --threads prefill 慢时可调大；也可与生成分开以稳定延迟 中 -C, --cpu-mask M / -Cr, --cpu-range lo-hi CPU 亲和性（绑核） 空 多租户/NUMA 机器、追求稳定延迟时必用 中 --cpu-strict \u0026lt;0|1\u0026gt; 严格按亲和性放置线程 0 绑核后想更“硬”的隔离 低~中 --prio N / --prio-batch N 进程/线程优先级 0 线上低延迟服务、避免被抢占（注意权限） 低~中 --poll \u0026lt;0...100\u0026gt; 工作等待策略（忙等 vs 休眠） 50 低延迟可提高；省电/散热可降低 低 -c, --ctx-size N 上下文长度（KV cache 规模随之增长） 0（从模型读） 需要更长上下文/多轮；或为了省内存而减小 高 -n, --n-predict N 生成 token 上限 -1（无限） 服务端务必设上限避免“跑飞” 高 -b, --batch-size N 逻辑最大 batch（prefill 吞吐） 2048 并发多、长 prompt 时调；过大可能导致内存峰值 中 -ub, --ubatch-size N 物理 micro-batch（更贴近实际算子切分） 512 GPU/CPU 都可能用：想提高吞吐但受显存/内存限制时调 中 --keep N 保留 prompt 前 N tokens 不参与丢弃/重算（与交互/续写相关） 0 交互式、需要保留系统提示词等 低~中 --swa-full / --ctx-checkpoints / --swa-checkpoints 与 SWA/上下文检查点相关（提高长上下文处理/缓存行为） false / 8 你明确在做长上下文 \u0026amp; 想用 checkpoint/回滚能力 低 -fa, --flash-attn [on|off|auto] FlashAttention（主要影响 GPU） auto GPU 推理一般保持 auto/on；CPU 基本无感 中 --perf 打开内部性能计时 false 你在压测/定位瓶颈时 中 -e, --escape 处理 \\n 等转义 true 只在你需要“原样”字符串时关掉 低 --rope-scaling {none,linear,yarn} RoPE 外推策略 模型默认（常为 linear） 你要“超训练长度”上下文时才碰 中 --rope-scale / --rope-freq-base / --rope-freq-scale RoPE 频率缩放细节（NTK/外推） 从模型读 不懂就别动；外推效果/困惑度会受影响 低~中 --yarn-*（orig-ctx/ext-factor/attn-factor/beta-*) YaRN 外推的一组超参 多为 -1/0 你确定用 YaRN 外推并且要调质量/稳定性 低 -kvo, --kv-offload KV cache offload（把 KV 放到不同设备/内存策略） enabled 多 GPU / 设备内存不够时；或要控制主显存占用 中 -ctk, --cache-type-k TYPE / -ctv, --cache-type-v TYPE KV cache 的 K/V 精度（f16/q8/q4…） f16/f16 省内存（尤其长 ctx + 多并发）；代价是可能降质/增算 中~高 --repack / --no-repack 权重重排/打包（提升访问效率） enabled 一般保持默认；极少数兼容问题才关 低 --mmap / --no-mmap 内存映射加载模型（快、占用小） enabled 容器/网络盘/奇怪 FS 导致抖动时可能关 中 --mlock 锁页：防止模型被换出/压缩 off 线上稳定性、避免 page-out（需要权限，内存要够） 中 --numa TYPE NUMA 优化（distribute/isolate/numactl） 未启用 双路/多路 CPU 服务器强烈建议研究 中 -dev, --device \u0026lt;...\u0026gt; 指定 offload 设备（GPU/加速卡） 未指定 你要明确用哪块卡/多卡 中 --list-devices 列设备 — 只用于查看 低 -ngl, --gpu-layers N offload 到 VRAM 的层数（速度关键） auto 有 GPU 就是核心参数：更多层=更快（直到显存顶住） 高 -sm, --split-mode {none,layer,row} 多 GPU 切分策略 layer 多卡推理/显存拼接 中 -ts, --tensor-split ... 多 GPU 分配比例 — 多卡手动配比 中 -mg, --main-gpu INDEX 主 GPU 选择 0 多卡指定主卡 低~中 -fit, --fit [on|off] / --fit-target / --fit-ctx 自动调参以“塞进显存/内存” on / 1024 / 4096 你想少算账让它自动收敛到可跑配置 中 --lora FNAME / --lora-scaled ... 加载 LoRA（可多份） — 你做 PEFT 推理时 中 --control-vector* 控制向量（实验特性） — 做风格/行为控制实验 低 -m, --model FNAME 模型路径 — 必填 高 -hf, --hf-repo ... / --hf-file / --hf-token 从 HF 拉取模型/文件 — 不想手动下载 gguf 时 中 --offline 强制离线，只用缓存 off 生产环境/无网机器 中 --override-kv KEY=TYPE:VALUE 覆盖 gguf 元数据（高级） — 你非常清楚自己在改什么 低 --check-tensors 检查非法 tensor 值 false 怀疑模型损坏/加载异常 低 2) Sampling params（输出风格/稳定性） 参数 作用 默认值 何时需要调 常用度 -s, --seed 随机种子（复现性） -1 随机 评测/回归测试要固定 中 --temp, --temperature 温度（随机性） 0.80 要稳定就降（0~0.3）；要发散就升 高 --top-k Top-K 截断 40 与 top-p 搭配；更稳可降 中 --top-p Nucleus 0.95 更稳可降到 0.8~0.9；更自由可升 高 --min-p Min-P（低概率截断） 0.05 想减少胡言乱语/罕见词可提高一点 中 --typical-p Typical sampling 1.00（关） 你明确要“更像训练分布”时才用 低 --repeat-last-n 重复惩罚窗口 64 长文重复明显就增大 中 --repeat-penalty 重复惩罚强度 1.00（关） 1.05~1.2 常见；过高会伤连贯性 中 --presence-penalty / --frequency-penalty 类 OpenAI 的重复惩罚 0 需要控制复读时 低~中 --mirostat / --mirostat-lr / --mirostat-ent Mirostat 自适应熵控制 off 你想“长文稳定熵”且知道在干嘛 低 --ignore-eos 忽略 EOS 继续生成 off 只在流式/特殊需求，服务端一般别开 低 --logit-bias ... 对 token 施加偏置 — 禁词/强制倾向，工程上很有用 中 --grammar / --grammar-file BNF grammar 约束生成 '' 结构化输出（JSON）强烈建议用 高（做抽取时） -j, --json-schema / --json-schema-file JSON Schema 约束 — 比 grammar 更直观：强制合法 JSON 高（做抽取时） --samplers / --sampling-seq 自定义采样器链 有默认链 你在研究采样策略时才改 低 --dry-* / --xtc-* / --adaptive-* / --dynatemp-* 一堆高级采样增强 默认多为关闭 追求特定风格/去重复/自适应才用 低 3) Server / example-specific params（并发/缓存/鉴权/模板） 3.1 并发与批处理（吞吐核心） 参数 作用 默认值 何时需要调 常用度 -np, --parallel N server slots 数（并发请求槽位） -1 auto 线上服务按 QPS/延迟目标配置 高 -cb, --cont-batching 连续/动态 batching enabled 并发多时吞吐暴涨；但要留意尾延迟 高 --threads-http N HTTP 线程数 -1 高并发下避免请求处理成为瓶颈 中 -to, --timeout N 读写超时（秒） 600 生产一般缩短，避免连接占用 中 --warmup 空跑 warmup enabled 生产建议开，减少首请求抖动 中 --sleep-idle-seconds 空闲休眠 -1 off 节能/桌面用；线上通常关闭 低 3.2 Prompt/KV 缓存（省算力的关键） 参数 作用 默认值 何时需要调 常用度 --cache-prompt 启用 prompt caching enabled 复用系统提示词/固定前缀时大幅省 prefill 高 --cache-reuse N 允许 KV shifting 的最小复用 chunk 0 你有大量相似前缀请求时调大更赚 中 --slot-save-path PATH 保存 slot 的 KV cache disabled 需要跨重启保留上下文/会话时 低~中 -cram, --cache-ram N cache 最大 RAM（MiB） 8192 内存紧张或想限制缓存占用 中 3.3 鉴权、路由、静态资源 参数 作用 默认值 何时需要调 常用度 --host / --port 监听地址/端口 127.0.0.1:8080 对外服务、容器部署必配 高 --api-key KEY / --api-key-file API 鉴权 none 对外网暴露必开 高 --ssl-key-file / --ssl-cert-file TLS none 直出 HTTPS（或交给 Nginx） 中 --path / --api-prefix 静态目录 / API 前缀 空 你需要挂 WebUI 或反向代理路径 中 --webui / --no-webui Web UI enabled 生产通常关；本地调试可开 中 --metrics Prometheus metrics disabled 生产监控 中 --slots slots 监控端点 enabled 一般保持开 中 --props 允许 POST /props 改全局属性 disabled 多租户/安全考虑；一般别开 低 3.4 Chat 模板与“思考”格式 参数 作用 默认值 何时需要调 常用度 --chat-template ... / --chat-template-file ... 指定/覆盖 chat 模板 从模型元数据取 模型模板不匹配、你要统一输出风格时 中 --jinja / --no-jinja 是否启用 jinja 模板引擎 enabled 只有在排障/兼容时才关 低 --reasoning-format 思考内容如何返回（none/deepseek/legacy） auto 你要对外 API 隐藏/剥离思考时 中 --reasoning-budget 限制思考预算（-1 不限，0 关闭） -1 低延迟/确定性场景可设 0 中 --prefill-assistant 若最后一条是 assistant，是否预填 enabled 你做特定对话协议兼容时 低 哪些参数最常用？ A) CPU 推理/CPU Server 性能与稳定性 1 2 3 --threads / --threads-batch --numa distribute|isolate --cpu-mask / --cpu-range 内存\n1 2 3 4 --ctx-size --n-predict --mmap、--mlock --cache-type-k / --cache-type-v（需要更长 ctx/更多并发时） 服务\n1 2 3 --parallel、--cont-batching --cache-prompt、--cache-reuse --host、--port、--api-key B) GPU offload 1 2 3 --n-gpu-layers（最核心） --device、多卡则 --split-mode + --tensor-split --flash-attn C) 结构化抽取（JSON 输出） 1 2 3 --json-schema-file（或 --grammar-file） --temperature (采样侧) 0 或很低、--top-p 收紧、必要时 --seed 固定 --n-predict (服务侧：)设上限（比如 256/512） llama.cpp量化方案(如 Q4_K_M、Q5_K_S)的区别 llama.cpp量化方案(如 Q4_K_M、Q5_K_S)的区别\n","permalink":"https://blog.curlc.com/posts/quantize-qwen-with-llamacpp/","summary":"\u003cp\u003e在上一篇文章\u003ca href=\"https://blog.curlc.com/posts/fine-tuning-small-model-distillation/\"\u003e记一次小模型微调/蒸馏学习(Qwen3-0.6B 从收货地址中提取结构化信息)\u003c/a\u003e 中已经蒸馏出数据，由于服务器没有显卡，我将模型转为\u003ccode\u003eGGUF\u003c/code\u003e，然后量化为\u003ccode\u003eQ5_K_M\u003c/code\u003e，使用llama.cpp 进行推理。\u003c/p\u003e","title":"使用llama.cpp量化Qwen0.6B模型CPU运行"},{"content":"查看当前子模块 1 git submodule 或者：\n1 cat .gitmodules 输出类似：\n1 libs/foo 这里的 libs/foo 就是子模块路径。\n方法 Linux / macOS 下面命令仅需修改SUBMODULE字段。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ## 子模块目录 SUBMODULE=libs/foo \u0026amp;\u0026amp; \\ ## 注销子模块 ## 会移除 .git/config 中的 submodule 配置 git submodule deinit -f $SUBMODULE \u0026amp;\u0026amp; \\ ## 从 Git 索引中删除子模块 ## 注意：这里只是从 Git 管理中移除 git rm -f $SUBMODULE \u0026amp;\u0026amp; \\ ## 删除 Git 对子模块的缓存 ## 不删除这里会导致后续可能无法重新添加 rm -rf .git/modules/$SUBMODULE \u0026amp;\u0026amp; \\ ## 提交变更 git commit -m \u0026#34;remove submodule\u0026#34; Windows PowerShell 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ## 子模块目录 $SUBMODULE=\u0026#34;libs/foo\u0026#34; ## 注销子模块 ## 删除 Git 配置中的 submodule 信息 git submodule deinit -f $SUBMODULE ## 从 Git 索引中移除子模块 git rm -f $SUBMODULE ## 删除 Git 本地缓存 Remove-Item -Recurse -Force \u0026#34;.git/modules/$SUBMODULE\u0026#34; ## 提交变更 git commit -m \u0026#34;remove submodule\u0026#34; 如果想保留代码，仅取消 Submodule 这种情况不要直接删除目录。\nLinux / macOS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ## 子模块目录 SUBMODULE=libs/foo \u0026amp;\u0026amp; \\ ## 仅从 Git 索引中移除 ## 不会删除本地代码 git rm --cached $SUBMODULE \u0026amp;\u0026amp; \\ ## 删除 submodule 缓存 rm -rf .git/modules/$SUBMODULE \u0026amp;\u0026amp; \\ ## 重新作为普通目录加入 Git git add $SUBMODULE \u0026amp;\u0026amp; \\ ## 提交变更 git commit -m \u0026#34;convert submodule to normal directory\u0026#34; Windows PowerShell 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ## 子模块目录 $SUBMODULE=\u0026#34;libs/foo\u0026#34; ## 从 Git 索引中移除 git rm --cached $SUBMODULE ## 删除 submodule 缓存 Remove-Item -Recurse -Force \u0026#34;.git/modules/$SUBMODULE\u0026#34; ## 重新添加为普通目录 git add $SUBMODULE ## 提交变更 git commit -m \u0026#34;convert submodule to normal directory\u0026#34; 检查 1 git submodule 如果没有任何输出，说明已经删除成功。\n","permalink":"https://blog.curlc.com/posts/remove-git-submodule/","summary":"\u003ch2 id=\"查看当前子模块\"\u003e查看当前子模块\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit submodule\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e或者：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecat .gitmodules\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e输出类似：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elibs/foo\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e这里的 \u003ccode\u003elibs/foo\u003c/code\u003e 就是子模块路径。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"方法\"\u003e方法\u003c/h2\u003e\n\u003ch3 id=\"linux--macos\"\u003eLinux / macOS\u003c/h3\u003e\n\u003cp\u003e下面命令仅需修改\u003ccode\u003eSUBMODULE\u003c/code\u003e字段。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## 子模块目录\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eSUBMODULE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003elibs/foo \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## 注销子模块\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## 会移除 .git/config 中的 submodule 配置\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit submodule deinit -f \u003cspan class=\"nv\"\u003e$SUBMODULE\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## 从 Git 索引中删除子模块\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## 注意：这里只是从 Git 管理中移除\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit rm -f \u003cspan class=\"nv\"\u003e$SUBMODULE\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## 删除 Git 对子模块的缓存\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## 不删除这里会导致后续可能无法重新添加\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm -rf .git/modules/\u003cspan class=\"nv\"\u003e$SUBMODULE\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e## 提交变更\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit commit -m \u003cspan class=\"s2\"\u003e\u0026#34;remove submodule\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003chr\u003e\n\u003ch3 id=\"windows-powershell\"\u003eWindows PowerShell\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## 子模块目录\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$SUBMODULE\u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;libs/foo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## 注销子模块\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## 删除 Git 配置中的 submodule 信息\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003egit\u003c/span\u003e \u003cspan class=\"n\"\u003esubmodule\u003c/span\u003e \u003cspan class=\"n\"\u003edeinit\u003c/span\u003e \u003cspan class=\"o\"\u003e-f\u003c/span\u003e \u003cspan class=\"nv\"\u003e$SUBMODULE\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## 从 Git 索引中移除子模块\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003egit\u003c/span\u003e \u003cspan class=\"nb\"\u003erm \u003c/span\u003e\u003cspan class=\"o\"\u003e-f\u003c/span\u003e \u003cspan class=\"nv\"\u003e$SUBMODULE\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## 删除 Git 本地缓存\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eRemove-Item\u003c/span\u003e \u003cspan class=\"n\"\u003e-Recurse\u003c/span\u003e \u003cspan class=\"n\"\u003e-Force\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.git/modules/\u003c/span\u003e\u003cspan class=\"nv\"\u003e$SUBMODULE\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e## 提交变更\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003egit\u003c/span\u003e \u003cspan class=\"n\"\u003ecommit\u003c/span\u003e \u003cspan class=\"n\"\u003e-m\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;remove submodule\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"如果想保留代码仅取消-submodule\"\u003e如果想保留代码，仅取消 Submodule\u003c/h2\u003e\n\u003cp\u003e这种情况不要直接删除目录。\u003c/p\u003e","title":"Git 移除仓库中的子模块（Submodule）"},{"content":"介绍 Mox Mail 是一个开源的邮件服务器解决方案，用于收发电子邮件。支持 IMAP4、SMTP、SPF、DKIM、DMARC、MTA-STS、DANE 和 DNSSEC，基于信誉和基于内容的垃圾邮件过滤，国际化（EIA/IDNA），使用 ACME 和 Let\u0026rsquo;s Encrypt 自动 TLS，帐户自动配置，网页邮件。\nxmox 官网\n其次就是,资源占用低,使得低配置VPS也能流畅运行。\n部署条件 Linux 服务器 Docker 和 Docker Compose 已安装 能开放25端口（SMTP）、80端口（HTTP）、443端口（HTTPS）、143端口（IMAP）、465端口（SMTPS）、587端口（SMTP Submission）、993端口（IMAPS）。 可以在设置 rDNS（反向解析）的服务器， 域名（推荐使用独立域名） 在本文使用的是 Netcup 的 1o小鸡。\n部署步骤 设置rDNS rDNS（反向解析）是指通过IP地址查询对应的域名。设置rDNS有助于提高邮件的送达率，防止邮件被标记为垃圾邮件。\n登录到你的VPS提供商的控制面板，找到DNS管理或类似的选项，设置rDNS记录，将你的服务器IP地址指向你的域名。例如，如果你的域名是 mail.example.com，那么你需要将rDNS记录设置为 mail.example.com。\n开启域名DNSSEC DNSSEC（Domain Name System Security Extensions）是一种用于保护DNS数据完整性和真实性的安全协议。开启DNSSEC可以防止DNS欺骗和缓存投毒等攻击，提高域名解析的安全性。\n登录到你的域名注册商的控制面板，找到DNSSEC管理或类似的选项，启用DNSSEC功能。具体步骤可能因注册商而异，请参考注册商的帮助文档。\n安装 Unbound (可选) 此步骤因为比较麻烦，暂时可不做。\n目的是代替本机 systemd-resolved ，为了支持 DNSSEC、DANE。 安装教程\n邮件服务器本机DNS不开DNSSEC，那么会用 SPF/DKIM/DMARC/MTA-STS/TLS-RPT。Mox 会退回到 MTA-STS 或 opportunistic TLS。\n解析域名 在你的域名注册商的DNS管理面板中，添加以下DNS记录：\nA记录：将你的域名（如 mail.example.com）指向你的服务器IP地址。 关于其他DNS记录（如MX、SPF、DKIM等），稍后再设置。\n设置主机名 在服务器上设置主机名为你的域名（如 mail.example.com）：\n1 2 sudo hostnamectl set-hostname mail.example.com sudo systemctl restart systemd-hostnamed 核实 /etc/hosts 文件中有正确的主机名映射：\n1 2 3 4 # 1.本地环回地址映射 127.0.0.1 localhost # 2.主机名映射服务器公网 IP 地址 \u0026lt;182.68.1.90\u0026gt; mail.example.com 下载 Mox Mail Docker Compose 文件 创建一个目录来存放 Mox Mail 的 Docker Compose 文件：\n1 2 3 mkdir -p ~/mox-mail cd ~/mox-mail wget https://github.com/mjl-/mox/raw/refs/heads/main/docker-compose.yml docker-compose.yml 内的 image 版本,建议设置固定的, 官方版本记录: https://r.xmox.nl/r/mox/\n创建用户 在启动 mox 之前，运行快速入门程序以创建配置文件，以便以mox 用户身份运行。\n1 useradd -d $PWD mox 初始化配置文件 1 2 mkdir config data web docker-compose run mox mox quickstart you@yourdomain.example $(id -u mox) ps:\nyou@yourdomain.example 是初始域邮箱地址，例如 admin@yourdomain.example。 $(id -u mox) 是获取用户 ID 的命令，用于指定以哪个用户身份运行。 运行时，mox 会进行本服务器的外网 IP 进行 rDNS 检查，然后在配置文件中将Hostname初始化为你的 rDNS域名。\n运行后, 屏幕会输出一些初始化信息, 包括生成的密码等, 请妥善保存, 其中的Admin password,you@yourdomain.example账户密码 需要记录下来\n初始化中信息中的解析信息（DKIM、spf等）暂时不用理会，如果有配置错的地方，会有输出提示，虽然后续可以手动修改配置文件，但建议一次性设置好后，再次初始化，方便后续添加解析记录。\n运行后，mox 会在 config data web 目录中生成相应的配置文件。\n启动 Mox Mail 1 docker-compose up -d 管理Mox Mail 在这里，我们使用SSH隧道来访问 Mox Mail 的 Web 界面。\n1 ssh -L 8080:localhost:80 your_user@your_server_ip 更简单的是使用Xshell的SSH隧道功能，设置本地端口8080映射到服务器的80端口。\n然后在浏览器中访问 http://localhost:8080/admin，使用你在初始化时的Admin passwor登录。\n查看域名: 后续的图片就懒得打码了,也不是什么隐私信息~\n查看DNS设置: 将 Required DNS records 中的内容保存复制到本地txt文件.\n如果是使用 Cloudflare 解析域名, 那么则可以直接上传 txt 文件,否则需要自行手动添加。\n注意: 我看大佬说, Mox 为兼容部分垃圾 DNS 服务商，将 2 条 DKIM 长记录拆分为多段，Cloudflare 支持标准长记录。请务必手动将 DKIM 字段拼接为完整的记录，确保邮件签名校验正常。, 但我测试,我没拆分倒是也可以用,此处我借鉴大佬的经验, 直接写在此处备份:\n如原DKIM\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2026a._domainkey.example.com. TXT ( \u0026#34;v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqAFl2HmyX1IgKDMbk+p4aCRtpt+jBzKFIq8Sr\u0026#34; \u0026#34;9JzeqNfFH8EKyGmR+snt1JAR5xZX87j3uYxaYSaxXV8HlBu4SWKgQM2pSZRGQciNjaHIjGIhgdx8KrBDR6Ds+t9xISUrP7ScapZU\u0026#34; \u0026#34;t69GMIDciDwcZWWTSrAE81vUt7c3K9bk5yiZo5Cbx2ecjE/9x+YVglXi9Qn48mAibdA0fNpyDvhuCEidMMaBnDYvkcpM9QGHmDkZ\u0026#34; \u0026#34;4Ib1UCsVDWWWB+5A+gxyX5dw9WGTSiN68P2zgOchffvuYScm+XK3T8HY1C1xECkdMs21e+gAhIsCu/Zs6WcH9ziRpeF1J+ZY4jbf\u0026#34; \u0026#34;8oKdwIDAQAB\u0026#34; ) 2026b._domainkey.example.com. TXT ( \u0026#34;v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXEtTjp3eSw4IVA842RPSnBNqd1xFfTbGfeJO\u0026#34; \u0026#34;NnxdwnEutxVaPs2LCV2fM1YnvAymcHqNP6Z88mhKSyAoqf/33rCeJAupBvda1BiW5ms2PT8ssc8L8RUNyzcGMMv1Z7A+uW6XqrbB\u0026#34; \u0026#34;jyaRPWl1kKZde54LWaCqVZOhGnWRANpdSqz12Ix14L6Sqih+ngFej8xZpgS4I3GVaGSplLXIVZ8BP3C7ZdMOVjvZuMXkveHCVR9h\u0026#34; \u0026#34;lQzQGuWFvmm9OBf3vqLwKhICfdPI2eCUbRX6zhQpEeEg3CUECqWgKpFKTbud8IGAJMi+dDbXwXhwD09BxGk4L0Kg8hWtkzda2lsy\u0026#34; \u0026#34;1Yz8QIDAQAB\u0026#34; ) 那么则是删除双引号和换行, 拼接为一行:\n1 2 3 4 5 6 7 2026a._domainkey.example.com. TXT ( \u0026#34;v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqAFl2HmyX1IgKDMbk+p4aCRtpt+jBzKFIq8Sr9JzeqNfFH8EKyGmR+snt1JAR5xZX87j3uYxaYSaxXV8HlBu4SWKgQM2pSZRGQciNjaHIjGIhgdx8KrBDR6Ds+t9xISUrP7ScapZUt69GMIDciDwcZWWTSrAE81vUt7c3K9bk5yiZo5Cbx2ecjE/9x+YVglXi9Qn48mAibdA0fNpyDvhuCEidMMaBnDYvkcpM9QGHmDkZ4Ib1UCsVDWWWB+5A+gxyX5dw9WGTSiN68P2zgOchffvuYScm+XK3T8HY1C1xECkdMs21e+gAhIsCu/Zs6WcH9ziRpeF1J+ZY4jbf8oKdwIDAQAB\u0026#34; ) 2026b._domainkey.example.com. TXT ( \u0026#34;v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXEtTjp3eSw4IVA842RPSnBNqd1xFfTbGfeJONnxdwnEutxVaPs2LCV2fM1YnvAymcHqNP6Z88mhKSyAoqf/33rCeJAupBvda1BiW5ms2PT8ssc8L8RUNyzcGMMv1Z7A+uW6XqrbBjyaRPWl1kKZde54LWaCqVZOhGnWRANpdSqz12Ix14L6Sqih+ngFej8xZpgS4I3GVaGSplLXIVZ8BP3C7ZdMOVjvZuMXkveHCVR9hlQzQGuWFvmm9OBf3vqLwKhICfdPI2eCUbRX6zhQpEeEg3CUECqWgKpFKTbud8IGAJMi+dDbXwXhwD09BxGk4L0Kg8hWtkzda2lsy1Yz8QIDAQAB\u0026#34; ) 到此为止,就算搭建完成了，接下来就是测试收发邮件。\n测试收发邮件 在浏览器中访问 http://localhost:8080/webmail，有一个比较简单的网页邮件客户端，可以用来测试收发邮件。\n用户名可以用初始化时创建的邮箱地址，密码是初始化时生成的密码。\n或者是在 admin 控制台 中创建新的邮箱账户,http://localhost:8084/admin/#accounts。\n打开 https://www.mail-tester.com ，获取一个测试邮箱地址，然后从 Mox Mail 发送一封邮件到这个测试邮箱地址。\n发送以后查看测试结果，看看是否有问题。如果有问题，可以根据提示进行调整。 尽量达到10分再进行发邮件, 但难的不是搭建服务，是邮箱域名怎么被大厂支持不拉黑,所以,自己搭建玩玩就好,或者当作自己的私人邮件服务器使用。别说后续还有反垃圾、反病毒等等。\nhttps://internet.nl/test-mail/?invalid 也是一个不错的测试网站, 可以测试邮件服务器的各项指标。\n一些查邮箱是否被拉黑的网站:\nhttps://multirbl.valli.org/lookup/\n注意 在本文档中默认生成的配置文件中，Mox Mail 会尝试使用mail.example.com自动获取和续订 TLS 证书。 https://internet.nl/test-mail/?invalid 检测可以看出，启用不完善，例如 没有开启IPv6、DANE，会导致不是全绿，我个人使用倒是觉得没什么影响。但是，如果你的服务器有IPv6，那么还需要配置 ipv6的 PTR / rDNS，发信主机名的 AAAA 记录、SPF。这是很重要的一点，如果有IPv6而没有配置，那么会导致优先使用IPv6进行发件，从而导致对方邮局 rtp、spf 校验失败从而进垃圾箱或者拒收！！！，所以，要么配置，要么禁用IPv6发件 如果要开启 DANE ,那么前提是你的域名注册商支持 DNSSEC, 并且你已经开启 DNSSEC。Linux自带的systemd-resolved 不支持本地 DNSSEC 解析, 可以安装使用 unbound 作为本地 DNS 解析器 安装教程, 并开启 DNSSEC 支持。 (同时需要在dns服务商添加 TLSA 记录,记录值在 mox admin面板的 DNS 设置中可以看到_25._tcp.mail.xxx开头的) 配置IPv6（如果有） 配置 IPv6 的 PTR / rDNS\n在 云厂商 / VPS 面板 设置 IPv6 的 PTR / rDNS，指向你的邮件服务器域名（如 mail.example.com）。 添加 AAAA 记录\n在你的域名注册商的 DNS 管理面板中，添加 AAAA 记录，将你的域名（如 mail.example.com）指向你的服务器 IPv6 地址。 更新 SPF 记录\n在你的域名注册商的 DNS 管理面板中，更新 SPF 记录，添加你的 IPv6 地址。例如，如果你的 IPv6 地址是 2a00:0000:00:0001::/64，那么 SPF 记录应该类似于： 1 example.com. TXT \u0026#34;v=spf1 ip4:xxx.xxx.xxx.xxx ip6:2a00:0000:00:0001::/64 mx ~all\u0026#34; Mox如何禁用 IPv6 发件 如果你的服务器有 IPv6 地址，但你不想配置 IPv6，可以通过以下方式禁用 IPv6 发件： 编辑 Mox Mail 的配置文件 config/mox.conf，添加以下行：\n1 2 3 4 Transports: ipv4only: Direct: DisableIPv6: true domains.conf 文件中顶部新增 ipv4only 传输：\n1 2 3 Routes: - Transport: ipv4only 总结 个人感觉Mox Mail 还是挺不错的, 一步到位直接生成 ssl\\tls 证书、dns记录,后台管理面板虽然简单没有css样式装饰,但基本功能还是有。\n其次是 MTA-STS policies、DMARC evaluations、TLS connection results、DNSBL、DMARC aggregate reports 这些功能。\n参考 https://blog.dejavu.moe/posts/hosting-mox-mail-server-on-debian-13/\nmox mail API、Webhook文档\n附录(基础知识) 系统 DNS 解析器无 DNSSEC 验证有什么影响? 不验证 DNSSEC（比如用的是公共 DNS 但没开启验证，或本地链路被劫持/不可信），或\n不在“可信路径”（mox 的判断里，如果不是 loopback 例如 127.0.0.1，或者没有 trust-ad，会认为不够可信）。\n影响什么: 出站投递：对方的 MX 记录你是“未受保护”地查到的（理论上有 DNS 投毒风险）。\nDANE（TLSA）验证无法用：即使对方发布了 TLSA，你这边也无法基于 DNSSEC 去验证 TLS 公钥，只能退化到：\nMTA-STS（如果对方部署了）\n或“opportunistic TLS”（加密但不验证证书，容易被中间人降级/替换）\n但注意：这不是“发不出去邮件”，只是“安全能力下降”。\n没有启用 DNSSEC 签名有什么影响? 即使本机 DNS 解析器能验证 DNSSEC，但如果 你的域名 mail.example.com 的 zone 本身没做 DNSSEC 签名，那别人收你的邮件/给你发邮件时：\n也无法验证你在 DNS 里发布的 MX/SPF/DKIM/DMARC/MTA-STS 是否“不可篡改”\n你也没法让 mox 自动配置 DANE (TLSA)（因为 TLSA 依赖 DNSSEC）\n因此 mox 在 TLSA 记录（_25._tcp.mail.example.com TLSA \u0026hellip;）注释掉了，提醒：启用 DNSSEC 后再加回来。\n影响什么: 投递率：基本没影响（主流大厂不因没 DNSSEC 拒收）。\n安全性：少了 DANE 这条“强认证”的路，只能依赖 CA 证书 + MTA-STS 或机会性 TLS。\nMX 记录 「别人怎么把邮件投递给你」\n1 example.com. MX 10 mail.example.com. 告诉全世界： “给 @example.com 的邮件，请投递到 mail.example.com 这台服务器” 没有会怎样 别人给你发邮件 → 直接失败 A / AAAA 记录 1 mail.example.com. A 1.2.3.4 把邮件服务器主机名解析成 IP MX 指向的目标必须能解析到 IP 没有会怎样 MX 存在但投递失败（找不到服务器） SPF 记录 「这封信是不是你授权的服务器发的」\n1 2 example.com. TXT \u0026#34;v=spf1 ip4:1.2.3.4 mx ~all\u0026#34; mail.example.com. TXT \u0026#34;v=spf1 a -all\u0026#34; 做什么 告诉收件服务器：\n“只有这些 IP / MX，才允许代表 example.com 发信”\n没有会怎样 SPF fail / neutral 很容易进垃圾箱 DMARC 无法通过 能解决什么 防止别人伪造 @example.com 发垃圾邮件 提高投递评分 DKIM 记录 1 2 2026a._domainkey.example.com TXT \u0026#34;v=DKIM1; p=MIIBI...\u0026#34; 2026b._domainkey.example.com TXT \u0026#34;v=DKIM1; p=MIIBI...\u0026#34; 做什么 邮件发出时，mox 用私钥给邮件签名 收件方用 DNS 里的公钥验证签名 没有会怎样 DMARC 只能靠 SPF（不稳定） 很多大厂（Gmail 等）评分降低 能解决什么 防篡改 明确“这是你域名真实发的邮件” 现代邮件系统核心组件\nDMARC 1 _dmarc.example.com TXT \u0026#34;v=DMARC1;p=reject;rua=mailto:dmarcreports@example.com!10m\u0026#34; 做什么 定义 最终裁决规则\n告诉对方：\nSPF / DKIM 都不通过 → 直接拒收 并给我发报告 没有会怎样 别人可以“半伪造”你的域名 你也拿不到失败报告 能解决什么 真正阻止域名被滥用 控制你域名的“邮件声誉” MTA-STS 1 2 mta-sts.example.com CNAME mail.example.com. _mta-sts.example.com TXT \u0026#34;v=STSv1; id=20260128T174441\u0026#34; 做什么 告诉对方：\n“给我投递邮件时，必须用 TLS，并验证证书”\n没有会怎样 回退到 opportunistic TLS（可被中间人降级） 能解决什么 防止 STARTTLS 降级攻击 提高传输安全性 TLSRPT 「TLS 出问题时告诉我」\n1 2 _smtp._tls.example.com TXT \u0026#34;v=TLSRPTv1; rua=mailto:tlsreports@example.com\u0026#34; _smtp._tls.mail.example.com TXT \u0026#34;v=TLSRPTv1; rua=mailto:tlsreports@mail.example.com\u0026#34; 做什么 当 TLS / MTA-STS / DANE 验证失败时 对方给你发 机器可读报告 能解决什么 你能知道：\n哪些服务器连不上你 是证书问题 / DNS 问题 / 配置问题 诊断工具\nDANE（TLSA） 「不用 CA，直接用 DNS 认证证书」\n1 _25._tcp.mail.example.com TLSA 3 1 1 ... 做什么 用 DNSSEC 保护的 DNS 告诉对方：你的 SMTP 证书公钥长这样 没有会怎样 只能依赖 CA + MTA-STS 关键前提 ❗ 必须启用 DNSSEC 所以在 mox 初始化时，检测到本机dns不支持，mox把它注释掉了\nAutoconfig / Autodiscover / SRV 1 2 3 4 autoconfig.example.com CNAME mail.example.com. _autodiscover._tcp.example.com SRV 0 1 443 mail.example.com. _imaps._tcp.example.com SRV 0 1 993 mail.example.com. _submissions._tcp.example.com SRV 0 1 465 mail.example.com. 做什么 Thunderbird / Outlook 自动识别服务器 用户只填邮箱地址和密码 没有会怎样 只能手动填服务器地址/端口 体验优化，不影响投递\n“禁用明文端口”的 SRV 1 2 _imap._tcp.example.com SRV 0 0 0 . _submission._tcp.example.com SRV 0 0 0 . 做什么 明确告诉客户端：\n“别用不加密端口”\n安全姿态声明\nCAA 「谁可以给我签 TLS 证书」\n1 example.com CAA 0 issue \u0026#34;letsencrypt.org\u0026#34; 做什么 限制只有 Let’s Encrypt 能给你发证书 能解决什么 防止 CA 被滥用签发证书 ","permalink":"https://blog.curlc.com/posts/docker-mox-mail/","summary":"\u003ch2 id=\"介绍\"\u003e介绍\u003c/h2\u003e\n\u003cp\u003eMox Mail 是一个开源的邮件服务器解决方案，用于收发电子邮件。支持 IMAP4、SMTP、SPF、DKIM、DMARC、MTA-STS、DANE 和 DNSSEC，基于信誉和基于内容的垃圾邮件过滤，国际化（EIA/IDNA），使用 ACME 和 Let\u0026rsquo;s Encrypt 自动 TLS，帐户自动配置，网页邮件。\u003c/p\u003e","title":"使用Docker搭建Mox Mail 邮局"},{"content":"最近申请了一张 U 卡，基于 USDC 进行充值，然后提现到 U 卡进行消费。这让我想起了 19 年挖过人人影视的 CVNT 币，当时也是可以闪兑成 ETH 的。\n当时好奇 ETH 的原理，但没有现在学习这么方便（有 AI 加成），一直想搭建私链却没成功，后来在 ETH 的测试链上玩了一段时间（主要想体验一下转账、发币等）。现在各种开源工具非常丰富，技术也趋于成熟，所以决定自己搭建一个私链来研究一下。\n其次的目的就是想学习区块链实战，例如如何让业务系统的关键数据上链，如：交易（hash）、文章防伪（hash）、存证（hash）等。\n本文基于 Geth 搭建以太坊私链，选择它的理由如下：\n官方支持：以太坊官方参考实现 生态完善：支持 EVM、Solidity、MetaMask、ethers.js 场景灵活：公链 / 私链 / 离线私链均可运行 资源丰富：文档齐全，社区活跃 准备工作 运行环境：Windows 10 + PowerShell。如果是 Linux 环境，只需自行配置环境变量并微调命令格式即可，差异不大。 共识机制：Clique PoA。 1. 下载 Geth 下载 Geth 1.13.X 版本，本文使用的是 1.13.15 版本。\n[!IMPORTANT] 版本注意：1.13.x 之后的版本不再支持 PoA/PoW 这种“传统执行层单机共识”链。它要求 PoS（合并后）网络，否则你会看到如下报错：\n1 ERROR[01-17|18:18:27.324] Geth only supports PoS networks. Please transition legacy networks using Geth v1.13.x. 2. 安装与配置 解压并安装到特定目录，设置好环境变量。 准备私链目录结构，例如我的路径是 E:\\geth\\geth-ledger。 后续所有命令均在此目录下执行。在文件夹内使用 SHIFT + 右键，选择“在此处打开 PowerShell 窗口”。\n创建账户 我们需要创建 2 个账户：一个用于出块，一个用于转账测试。\n出块者：负责签块（PoA）。 转账者：负责转账（用于体验，创世时会分配 1000 个 ETH）。 1 2 geth --datadir data account new geth --datadir data account new 返回数据示例：\n1 2 3 4 5 6 7 Public address of the key: 0x2F02cA3b39C3e86566246489787F37C0453888A2 Path of the secret key file: data\\keystore\\UTC--2026-01-17T09-27-07.047721600Z--2f02ca3b39c3e86566246489787f37c0453888a2 - You can share your public address with anyone. Others need it to interact with you. - You must NEVER share the secret key with anyone! The key controls access to your funds! - You must BACKUP your key file! Without the key, it\u0026#39;s impossible to access account funds! - You must REMEMBER your password! Without the password, it\u0026#39;s impossible to decrypt the key! 执行后会提示输入密码，请务必牢记！ 目录下会生成一个 keystore 文件，里面存储了加密后的私钥。 保存密码到文件 为了方便后续启动，我们将密码保存到文件中（请妥善保管）：\nPowerShell (Windows)：\n1 2 Set-Content -Path .\\miner.pass -Value \u0026#34;miner_password\u0026#34; -NoNewline -Encoding ASCII Set-Content -Path .\\biz.pass -Value \u0026#34;biz_password\u0026#34; -NoNewline -Encoding ASCII Bash (Linux)：\n1 2 echo \u0026#34;miner_password\u0026#34; \u0026gt; miner.pass echo \u0026#34;biz_password\u0026#34; \u0026gt; biz.pass 在本教程中，我的地址分配如下：\n出块者地址 (miner): 0x2F02cA3b39C3e86566246489787F37C0453888A2 转账者地址 (biz): 0xe8aCb15b1d4dB40292B10C8169d369dff180C2f9 创建 genesis.json 文件 这是 Clique (PoA) 私链的创世块配置文件。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 { \u0026#34;config\u0026#34;: { \u0026#34;chainId\u0026#34;: 202601, \u0026#34;homesteadBlock\u0026#34;: 0, \u0026#34;eip150Block\u0026#34;: 0, \u0026#34;eip155Block\u0026#34;: 0, \u0026#34;eip158Block\u0026#34;: 0, \u0026#34;byzantiumBlock\u0026#34;: 0, \u0026#34;constantinopleBlock\u0026#34;: 0, \u0026#34;petersburgBlock\u0026#34;: 0, \u0026#34;istanbulBlock\u0026#34;: 0, \u0026#34;clique\u0026#34;: { \u0026#34;period\u0026#34;: 2, \u0026#34;epoch\u0026#34;: 30000 } }, \u0026#34;nonce\u0026#34;: \u0026#34;0x0\u0026#34;, \u0026#34;timestamp\u0026#34;: \u0026#34;0x0\u0026#34;, \u0026#34;extraData\u0026#34;: \u0026#34;0x00000000000000000000000000000000000000000000000000000000000000002f02ca3b39c3e86566246489787f37c0453888a2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\u0026#34;, \u0026#34;gasLimit\u0026#34;: \u0026#34;0x2FAF080\u0026#34;, \u0026#34;difficulty\u0026#34;: \u0026#34;0x1\u0026#34;, \u0026#34;mixHash\u0026#34;: \u0026#34;0x0000000000000000000000000000000000000000000000000000000000000000\u0026#34;, \u0026#34;coinbase\u0026#34;: \u0026#34;0x0000000000000000000000000000000000000000\u0026#34;, \u0026#34;alloc\u0026#34;: { \u0026#34;0xe8aCb15b1d4dB40292B10C8169d369dff180C2f9\u0026#34;: { \u0026#34;balance\u0026#34;: \u0026#34;0x3635C9ADC5DEA00000\u0026#34; } 带注释版本:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 { \u0026#34;config\u0026#34;: { // 链ID：用于交易签名防重放；与你的 networkid 不强制相等，但通常保持一致更清晰 \u0026#34;chainId\u0026#34;: 202601, // 链ID，必须唯一，不能和主网、测试网冲突 // 下面这些 *Block=0 表示：从创世块开始就启用对应的硬分叉规则 // 好处：规则一致、少踩坑；坏处：没什么坏处（私链推荐这样写） \u0026#34;homesteadBlock\u0026#34;: 0, // 升级到 Homestead 协议的区块高度 \u0026#34;eip150Block\u0026#34;: 0, // 升级到 EIP150 协议的区块高度 \u0026#34;eip155Block\u0026#34;: 0, // 升级到 EIP155 协议的区块高度 \u0026#34;eip158Block\u0026#34;: 0, // 升级到 EIP158 协议的区块高度 \u0026#34;byzantiumBlock\u0026#34;: 0, // 升级到 Byzantium 协议的区块高度 \u0026#34;constantinopleBlock\u0026#34;: 0, // 升级到 Constantinople 协议的区块高度 \u0026#34;petersburgBlock\u0026#34;: 0, // 升级到 Petersburg 协议的区块高度 \u0026#34;istanbulBlock\u0026#34;: 0, // 升级到 Istanbul 协议的区块高度 \u0026#34;clique\u0026#34;: { \u0026#34;period\u0026#34;: 2, \u0026#34;epoch\u0026#34;: 30000 } // Clique 共识机制配置 }, \u0026#34;nonce\u0026#34;: \u0026#34;0x0\u0026#34;, // 随机数，用于挖矿 \u0026#34;timestamp\u0026#34;: \u0026#34;0x0\u0026#34;, // 时间戳，创世区块时间 \u0026#34;extraData\u0026#34;: \u0026#34;0x00000000000000000000000000000000000000000000000000000000000000002f02ca3b39c3e86566246489787f37c0453888a2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\u0026#34;, // 额外数据，包含出块者地址 \u0026#34;gasLimit\u0026#34;: \u0026#34;0x2FAF080\u0026#34;, // 创世区块的 Gas 上限 \u0026#34;difficulty\u0026#34;: \u0026#34;0x1\u0026#34;, // 创世区块的难度 \u0026#34;mixHash\u0026#34;: \u0026#34;0x0000000000000000000000000000000000000000000000000000000000000000\u0026#34;, // 混合哈希 \u0026#34;coinbase\u0026#34;: \u0026#34;0x0000000000000000000000000000000000000000\u0026#34;, // 创世区块的矿工地址 \u0026#34;alloc\u0026#34;: { // 创世区块的预分配账户 \u0026#34;0xe8aCb15b1d4dB40292B10C8169d369dff180C2f9\u0026#34;: { \u0026#34;balance\u0026#34;: \u0026#34;0x3635C9ADC5DEA00000\u0026#34; } // 预分配1000个ETH } } 更详细查看genesis.json 详解\n初始化链 只用执行一次，除非你想重置。\n1 geth --datadir data init genesis.json 执行后，会在运行目录下生成 data 生成相关文件。\n启动 signer 节点（PowerShell） 1 2 3 4 5 6 7 8 9 10 geth ` --datadir data ` --networkid 202601 ` --http --http.addr 0.0.0.0 --http.port 8545 ` --http.api eth,net,web3,txpool,admin ` --http.corsdomain \u0026#34;*\u0026#34; --http.vhosts \u0026#34;*\u0026#34; ` --allow-insecure-unlock ` --unlock 0x2F02cA3b39C3e86566246489787F37C0453888A2 --password miner.pass ` --mine --miner.etherbase 0x2F02cA3b39C3e86566246489787F37C0453888A2 ` --txpool.pricelimit 0 带注释版本：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 # 使用 PowerShell 的反引号 ` 作为换行续写符 geth ` # 指定区块数据、状态数据、keystore 的存放目录 # 不写的话默认是 ~/.ethereum # 私链/多链并行时一定要显式指定 --datadir data ` # 网络 ID（P2P 层用） # 必须与 genesis.json 中的 chainId 区分理解 # networkid 用来防止节点连错网络 --networkid 202601 ` # 开启 HTTP RPC 服务（旧称 JSON-RPC） # 业务系统、脚本、控制台通常都通过它与 geth 交互 --http ` # HTTP RPC 监听地址 # 0.0.0.0 表示对外暴露（局域网/容器/宿主机可访问） --http.addr 0.0.0.0 ` # HTTP RPC 监听端口（以太坊传统默认 8545） --http.port 8545 ` # 允许通过 HTTP RPC 调用的 API 模块 # eth : 区块、交易、合约相关核心接口 # net : 网络信息（networkId、peer 数等） # web3 : 工具类接口（编码、hash 等） # txpool : 交易池状态（pending / queued） # admin : 节点管理（peers、enode、addPeer 等，生产环境要谨慎） --http.api eth,net,web3,txpool,admin ` # 允许任意来源的跨域请求（CORS） # 方便浏览器、前端、内部系统直接访问 --http.corsdomain \u0026#34;*\u0026#34; ` # 允许任意 Host 头访问 HTTP RPC # 在 Docker / 反向代理 / 内网环境中很常见 --http.vhosts \u0026#34;*\u0026#34; ` # 允许通过 RPC 解锁账户（非常危险的能力） # 在私链、内网、测试环境中常用 # 生产环境一般禁用 --allow-insecure-unlock ` # 启动时解锁指定账户 # 该账户通常是： # - Clique 的 signer（出块账户） # - 或业务服务用于发送交易的账户 --unlock 0x2F02cA3b39C3e86566246489787F37C0453888A2 ` # 解锁账户所使用的密码文件 # 文件内容是纯文本密码 --password miner.pass ` # 开启挖矿（在 Clique 中含义是：参与出块/签名） # 如果不加这个参数，节点只同步，不会出块 --mine ` # 指定出块收益地址 / 签名者地址 # 在 Clique 中通常与 --unlock 的账户相同 --miner.etherbase 0x2F02cA3b39C3e86566246489787F37C0453888A2 ` # 设置交易池最低 gas price # 0 表示：接受所有交易（即使 gasPrice = 0） # 私链里非常常见，避免“没钱发不了交易” --txpool.pricelimit 0 此时要是没有错误，输出类似:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 INFO [01-19|22:37:23.582] Maximum peer count ETH=50 total=50 WARN [01-19|22:37:23.600] Lowering memory allowance on 32bit arch available=65460 addressable=2048 WARN [01-19|22:37:23.600] Sanitizing cache to Go\u0026#39;s GC limits provided=1024 updated=682 INFO [01-19|22:37:23.600] Set global gas cap cap=50,000,000 INFO [01-19|22:37:23.602] Initializing the KZG library backend=gokzg INFO [01-19|22:37:23.687] Allocated trie memory caches clean=102.00MiB dirty=170.00MiB INFO [01-19|22:37:23.688] Using pebble as the backing database INFO [01-19|22:37:23.688] Allocated cache and file handles database=E:\\geth\\geth-ledger\\data\\geth\\chaindata cache=341.00MiB handles=8192 INFO [01-19|22:37:23.944] Opened ancient database database=E:\\geth\\geth-ledger\\data\\geth\\chaindata\\ancient/chain readonly=false INFO [01-19|22:37:23.945] State scheme set to already existing scheme=hash INFO [01-19|22:37:23.949] Initialising Ethereum protocol network=202,601 dbversion=8 INFO [01-19|22:37:54.864] Looking for peers peercount=0 tried=22 static=0 INFO [01-19|22:37:56.005] Successfully sealed new block number=29638 sealhash=8f8d95..7a6364 hash=867994..fb1bd1 elapsed=2.000s INFO [01-19|22:37:56.005] Commit new sealing work number=29639 sealhash=7be5a2..646ead txs=0 gas=0 fees=0 elapsed=0s INFO [01-19|22:37:58.005] Successfully sealed new block number=29639 sealhash=7be5a2..646ead hash=76321e..2e22ae elapsed=1.999s INFO [01-19|22:37:58.005] Commit new sealing work number=29640 sealhash=1c9f2d..35c595 txs=0 gas=0 fees=0 elapsed=\u0026#34;27.2µs\u0026#34; INFO [01-19|22:38:00.004] Successfully sealed new block number=29640 sealhash=1c9f2d..35c595 hash=53ecc6..63b509 elapsed=1.999s INFO [01-19|22:38:00.004] Commit new sealing work number=29641 sealhash=2b4a8a..d9688c txs=0 gas=0 fees=0 elapsed=0s 那就代表出快了。\n验证测试 浏览器安装MetaMask扩展 到各自浏览器的扩展商店搜索MetaMask并安装。\n导入钱包 在MetaMask中点击“添加钱包”，类型选择“JSON文件”(选择biz账户，里面有我们分配的1000ETH)\n选择刚才生成的keystore文件，输入密码，等待1-5分钟即可导入成功。\n配置MetaMask连接到私链 此时导入的钱包并没有ETH，我们需要在 MetaMask 切换到本地网络。\n1 2 3 4 网络名称：本地测试网络 新 RPC URL：http://localhost:8545 链 ID：202601 货币符号：ETH(随意) 选择本地测试网络\n这时，就能看见1000ETH了。(我已经用了一些) 发送交易 可以临时转到第一步生成的出块者地址，当然，你也可以再创建一个钱包测试。\n这里，我的数量输入 10。\n点击发送，MetaMask 会弹出确认窗口。这里可以更改燃料价格，因为我们在启动时设置了参数pricelimit，所以可以为 0。\n燃料限制为ETH内置常量(这是怎么计算的，查看详情) 验证交易 此时，可以用MetaMask导入收币的钱包，变能看见余额增加了。\n下一节，部署合约，让业务系统的业务数据上链。 编写中\u0026hellip;\u0026hellip;\n此篇内容仅为搭建记录，其中关于很多名词，我放在WIKI中了，避免污染格式。如有兴趣，可以去WIKI查看。\n","permalink":"https://blog.curlc.com/posts/blockchain-learning-1-building-private-chain-with-geth/","summary":"\u003cp\u003e最近申请了一张 U 卡，基于 USDC 进行充值，然后提现到 U 卡进行消费。这让我想起了 19 年挖过人人影视的 CVNT 币，当时也是可以闪兑成 ETH 的。\u003c/p\u003e\n\u003cp\u003e当时好奇 ETH 的原理，但没有现在学习这么方便（有 AI 加成），一直想搭建私链却没成功，后来在 ETH 的测试链上玩了一段时间（主要想体验一下转账、发币等）。现在各种开源工具非常丰富，技术也趋于成熟，所以决定自己搭建一个私链来研究一下。\u003c/p\u003e\n\u003cp\u003e其次的目的就是想学习区块链实战，例如如何让业务系统的关键数据上链，如：交易（hash）、文章防伪（hash）、存证（hash）等。\u003c/p\u003e","title":"区块链学习 1 - 基于 Geth 搭建私链"},{"content":"背景 在自建Vaultwarden (Bitwarden) 时，数据库一般在服务器的某个目录下，肯定要每天备份防止密码数据丢失，我目前是采用rclone备份到腾讯云的对象储存(老用户有免费50G的容量)。今天无意间看见新方法，备份到github仓库，故进行实践。原文\n步骤 1. 生成用于 GitHub 的 SSH 密钥（推荐 ed25519） 1 2 # 建议用独立文件名，避免覆盖你已有的 id_ed25519 ssh-keygen -t ed25519 -C \u0026#34;your_email@example.com\u0026#34; -f ~/.ssh/id_ed25519_github 执行后会生成：\n私钥：~/.ssh/id_ed25519_github\n公钥：~/.ssh/id_ed25519_github.pub\n2. 设置该密钥 Host 别名 目的是为了安全，该仓库在推送时使用这个密钥，而不默认使用账户级别的密钥。\n在 ~/.ssh/config 加一段\n1 vi ~/.ssh/config 1 2 3 4 5 Host github-vw-backup HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github IdentitiesOnly yes 3. 复制公钥 1 cat ~/.ssh/id_ed25519_github.pub 把输出整行复制（以 ssh-ed25519 开头）。\n上传到 GitHub 私有仓库，来备份数据库 新建仓库\n具体步骤略过\u0026hellip; 将公钥添加到 GitHub 仓库的部署密钥\n注意: 这里是添加到仓库的部署密钥，不是添加到你 GitHub 账号的 SSH 密钥！！！\n仓库 -\u0026gt; Settings -\u0026gt; Deploy keys -\u0026gt; Add deploy key (需要勾选 Allow write access )\n此步骤是为了安全性考虑。\n3. 初始化本地仓库 1 2 3 4 cd /path/to/your/project git init git add . git commit -m \u0026#34;Initial backup\u0026#34; /path/to/your/project 为vw目录\nyour_username 为 GitHub 用户名\nyour_repository 为仓库名。\n4. 关联远端仓库并推送 注意：这里使用的是 github-vw-backup，而不是 github.com。github-vw-backup为第二步设置的别名。\n1 2 git remote add origin git@github-vw-backup:your_username/your_repository.git git push -u origin master 执行后，初始数据库就会被推送到 GitHub 仓库了。\n5. 编写备份脚本 1 vi /usr/local/bin/vw_backup.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #!/usr/bin/env bash set -euo pipefail # ====== 配置 ====== REPO_DIR=\u0026#34;/path/to/your/project\u0026#34; BRANCH=\u0026#34;master\u0026#34; LOG_FILE=\u0026#34;/var/log/vw_backup.log\u0026#34; # 可选：给提交信息加主机名，方便区分多台机器 HOST_TAG=\u0026#34;$(hostname -s)\u0026#34; # ============================ mkdir -p \u0026#34;$(dirname \u0026#34;$LOG_FILE\u0026#34;)\u0026#34; ts() { date \u0026#34;+%Y-%m-%d %H:%M:%S\u0026#34;; } { echo \u0026#34;[$(ts)] backup start: $REPO_DIR\u0026#34; cd \u0026#34;$REPO_DIR\u0026#34; # 确保在正确分支 git rev-parse --is-inside-work-tree \u0026gt;/dev/null git checkout -q \u0026#34;$BRANCH\u0026#34; # 拉一下远端（避免非快进导致 push 失败；如果不希望自动合并，可改成只检测） git fetch -q origin \u0026#34;$BRANCH\u0026#34; || true # 可选：如果希望本地永远覆盖远端备份，可以用 reset（谨慎） # git reset --hard \u0026#34;origin/$BRANCH\u0026#34; || true # 只在有变更时才提交 if [[ -n \u0026#34;$(git status --porcelain)\u0026#34; ]]; then git add -A # 提交信息里记录时间与主机名 git commit -m \u0026#34;auto backup $(date +%F\\ %T) @${HOST_TAG}\u0026#34; || true # 推送 git push -u origin \u0026#34;$BRANCH\u0026#34; echo \u0026#34;[$(ts)] pushed changes.\u0026#34; else echo \u0026#34;[$(ts)] no changes.\u0026#34; fi echo \u0026#34;[$(ts)] backup done.\u0026#34; echo \u0026#34;----------------------------------------\u0026#34; } \u0026gt;\u0026gt; \u0026#34;$LOG_FILE\u0026#34; 2\u0026gt;\u0026amp;1 给执行权限：\n1 2 # 赋予执行权限 chmod +x /usr/local/bin/vw_backup.sh ps: 最好手动执行一下脚本，确保脚本没有问题\n1 2 3 4 5 # 手动执行脚本 bash /usr/local/bin/vw_backup.sh # 查看日志 tail -f /var/log/vw_backup.log 6.设置定时任务 1 crontab -e 例如: 每天凌晨 2 点执行备份\n1 0 2 * * * /usr/local/bin/vw_backup.sh 例如: 每 30 分钟执行一次备份\n1 */30 * * * * /usr/local/bin/vw_backup.sh 看日志验证：\n1 tail -f /var/log/vw_backup.log 另一种备份方式(RCLONE)(参考) 1. 下载RCLONE并配置 1 2 3 4 5 6 7 8 9 # 下载 wget https://downloads.rclone.org/rclone-current-linux-amd64.zip unzip rclone-current-linux-amd64.zip sudo cp rclone-current-linux-amd64/rclone /usr/local/bin/ # 配置 rclone config # 后续配置自行查看官方文档 2. 编写本地备份脚本 1 vi /usr/local/bin/vw_s3_backup.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #!/usr/bin/env bash # 备份目录 DATA_DIR=\u0026#34;/path/to/your/project\u0026#34; # 本地临时存放备份文件的目录 TEMP_DIR=\u0026#34;/path/to/your/project/tmp\u0026#34; # rclone 配置的远端名称和路径 REMOTE=\u0026#34;tencent_oss:backup-us-xxxxxxxxxx/my-bitwarden-backups\u0026#34; # 日志文件路径 LOG_FILE=\u0026#34;/var/log/vw_backup_s3.log\u0026#34; # 时间戳函数 ts() { date +\u0026#34;%Y-%m-%d %H:%M:%S\u0026#34; } # 确保临时目录和日志目录存在 mkdir -p \u0026#34;$(dirname \u0026#34;$TEMP_DIR\u0026#34;)\u0026#34; mkdir -p \u0026#34;$(dirname \u0026#34;$LOG_FILE\u0026#34;)\u0026#34; { echo \u0026#34;[$(ts)] ==\u0026gt; 开始 S3 备份任务\u0026#34; # 生成时间戳，作为备份文件名称区分 TIMESTAMP=$(date +\u0026#34;%Y%m%d_%H%M%S\u0026#34;) BACKUP_FILE=\u0026#34;vaultwarden_${TIMESTAMP}.tar.gz\u0026#34; LOCAL_BACKUP_PATH=\u0026#34;${TEMP_DIR}/${BACKUP_FILE}\u0026#34; # 打包 Vaultwarden 数据目录 echo \u0026#34;[$(ts)] ==\u0026gt; 开始打包 Vaultwarden 数据目录...\u0026#34; tar -czf \u0026#34;${LOCAL_BACKUP_PATH}\u0026#34; -C \u0026#34;${DATA_DIR}\u0026#34; . # 将打包好的文件上传到 S3 echo \u0026#34;[$(ts)] ==\u0026gt; 上传备份文件到 S3...\u0026#34; rclone copy \u0026#34;${LOCAL_BACKUP_PATH}\u0026#34; \u0026#34;${REMOTE}\u0026#34; # 上传完成后，删除本地临时文件，节省空间 rm -f \u0026#34;${LOCAL_BACKUP_PATH}\u0026#34; # 删除 S3 上 30 天前的备份 echo \u0026#34;[$(ts)] ==\u0026gt; 清理 S3 上 30 天之前的旧备份...\u0026#34; rclone delete --min-age 30d \u0026#34;${REMOTE}\u0026#34; echo \u0026#34;[$(ts)] ==\u0026gt; 备份完成并清理旧文件完毕！\u0026#34; echo \u0026#34;--------------------------------------------------\u0026#34; } \u0026gt;\u0026gt; \u0026#34;$LOG_FILE\u0026#34; 2\u0026gt;\u0026amp;1 1 2 # 赋予执行权限 chmod +x /usr/local/bin/vw_s3_backup.sh 3. 设置定时任务 1 vi /etc/crontab 1 0 3 * * * /usr/local/bin/vw_s3_backup.sh ","permalink":"https://blog.curlc.com/posts/backup-vaultwarden-to-github-private-repo/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e在自建Vaultwarden (Bitwarden) 时，数据库一般在服务器的某个目录下，肯定要每天备份防止密码数据丢失，\u003ca href=\"/posts/backup-vaultwarden-to-github-private-repo/#%e5%8f%a6%e4%b8%80%e7%a7%8d%e5%a4%87%e4%bb%bd%e6%96%b9%e5%bc%8fs3%e5%8f%82%e8%80%83\"\u003e我目前是采用\u003ccode\u003erclone\u003c/code\u003e备份到腾讯云的对象储存(老用户有免费50G的容量)\u003c/a\u003e。今天无意间看见新方法，备份到github仓库，故进行实践。\u003ca href=\"https://www.nodeseek.com/post-582522-1\"\u003e原文\u003c/a\u003e\u003c/p\u003e","title":"将自建Vaultwarden (Bitwarden) 数据库增量备份到github 私有仓库"},{"content":"背景: 最近3个月左右，只要打开任意国外网站，那么间接性会出现 DNS 解析异常的问题，表现为网页无法打开，无法解析出域名。这时使用ping 则表现为 请求找不到主机 xxx。请检查该名称，然后重试。，但只要使用nslookup 后则可以正常解析域名，且浏览器也可以正常打开。\n但因为这种情况时有时无，所以也就一直没有去深究这个问题，直到最近实在是受不了了，决定彻底解决这个问题。\n如果想直接查看如何搭建，点击跳转。\n问题排查: 1. 怀疑 DNS 服务器问题 开始的时候，我以为是DNS服务器问题(我用的阿里的 223.5.5.5),因为看到阿里说过会对公共DNS进行限流，然后期间不间断的更换了多个DNS服务器，如 114、119 等等，甚至更换过 8.8.8.8，想过会被“提前”返回数据，但只要能正常解析就行，但无果。\n2. 怀疑IPv6 问题 毕竟现在IPv6路由还是不怎么样，我将IPv6在路由器关闭后，无果。\n也尝试在控制面板关闭v6协议。\n1 2 3 4 5 6 控制面板 → 网络和 Internet → 网络连接 → 当前网卡 → 属性 → 取消勾选「Internet 协议版本 6 (IPv6)」 3. 怀疑 Windows 的 DNS Client（dnscache）服务异常 Windows 的 DNS 解析路径大概是：\n1 2 3 4 5 6 7 应用（Firefox / 其他软件） ↓ Windows DNS Client 服务（dnscache） ↓ 系统缓存 / UDP 查询 ↓ DNS 服务器 也就是 DNS Client 服务还在运行，但内部状态卡死 / 超时，也会照常无法解析，但同样的，国内网站没问题。\n这里GPT的回答是:\nnslookup 会强制唤醒 / 刷新 Windows 的 DNS Client（dnscache）服务状态 nslookup 不完全依赖 dnscache,会直接发起一次 DNS 查询，这个行为会 刷新 DNS socket、更新系统 DNS 缓存，让 dnscache 从“半死不活”状态恢复。\n这里是最难排除的，因为涉及到 本机网卡、代理、TUN 等。直到现在，我都不能保证这部分是否有问题。\n4.怀疑 本地的 DNS 缓存出现了问题 尝试清除 DNS 缓存，命令为 ipconfig /flushdns，无果，坚持不了多久。\n5. 怀疑运营商 其实到这一步，我是没想到会是运营商，之前听说过移动的墙中墙，但也只是对违法网站做劫持、屏蔽等，但没想到会无脑对dns协议，国外网站dns解析做随机的屏蔽(此屏蔽也不是一直有，等个十几秒或者一直按浏览器F5刷新，有几率可以解析出来)。\n抓包 本机环境:\nDNS: 119.29.29.29\n刚好异常的网站: www.ip2location.io\n这时刚好www.ip2location.io无法解析了，通过对本机DNS抓包，发现 114 返回的包则是一堆的d.root-servers.net d.root-servers.net，这是DNS的根服务器，但为什么返回是这样，暂时不清楚是移动还是DNS服务商配置错了，还是别的原因，个人能力有限，无法证实。\nAnswer 区是空的（没有 A 记录） Authority 区给了一堆根服务器 NS 看上去像“给了结果”，但等价于：没解析出来 查看响应： Flags=0x8180\n递归可用但返回了一个“空答案 + root NS 列表”的 NOERROR。这属于 “NODATA/空应答（NOERROR + Answer=0）” 形态，只是它给的 Authority 是 root-servers。\n把 0x8180 拆开（Wireshark 里其实也能展开看到）：\n0x8000：QR=1（这是 response） 0x0100：RD=1（请求了递归） 0x0080：RA=1（服务器“声称”递归可用） 0x0000：RCODE=0（No error） 所以：“能递归，没错误”，但又不给 A 记录，而是给了一堆 root NS。\n这意味着：递归链路在某一环节失败了，但 resolver 没按常规用 SERVFAIL 表达，而是返回了一个等价于“没拿到数据”的包（NOERROR/0 answers）。\n注意: 此时我无法使用nslookup对别的dns进行验证，因为一旦执行了nslookup，那么就会“解析成功”，此时因该用另一台电脑进行解析排除，这也是不严谨的地方。\n为什么跑 nslookup 一下就可以解析? 查看图里的标注2，我在此时执行了 nslookup 命令。\n1、系统先做了一个 PTR 29.29.29.119.in-addr.arpa（反查 DNS 服务器名） 2、紧接着：同域名 A 就返回了正确 IP\n这非常像nslookup 触发了额外的 DNS 交互（例如先探测、再查询），同时“恰好”命中了一个正常工作/允许递归的解析路径或节点，于是后续这个域名就被缓存，浏览器就可以解析了。\n但这里的“缓存”可以发生在：\n119.29.29.29 对应的某个 Anycast 节点 或中间网络/路由对某类 DNS 包的处理路径 我这里先怀疑 第二种 可能，也就是DNS被劫持了。看看有没有效果。\ndig解析测试 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 admin@Home-wh:/$ dig @114.114.114.114 www.ip2location.io A ; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.18.44-1~deb12u1-Debian \u0026lt;\u0026lt;\u0026gt;\u0026gt; @114.114.114.114 www.ip2location.io A ; (1 server found) ;; global options: +cmd ;; Got answer: ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NOERROR, id: 13371 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;www.ip2location.io.\tIN\tA ;; AUTHORITY SECTION: .\t518400\tIN\tNS\tM.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tK.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tL.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tI.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tH.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tC.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tD.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tE.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tG.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tB.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tA.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tF.ROOT-SERVERS.NET. .\t518400\tIN\tNS\tJ.ROOT-SERVERS.NET. ;; Query time: 3 msec ;; SERVER: 114.114.114.114#53(114.114.114.114) (UDP) ;; WHEN: Thu Apr 02 23:36:42 CST 2026 ;; MSG SIZE rcvd: 258 admin@Home-wh:/$ dig @119.29.29.29 www.ip2location.io A ; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.18.44-1~deb12u1-Debian \u0026lt;\u0026lt;\u0026gt;\u0026gt; @119.29.29.29 www.ip2location.io A ; (1 server found) ;; global options: +cmd ;; Got answer: ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NOERROR, id: 36659 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 13, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1232 ;; QUESTION SECTION: ;www.ip2location.io.\tIN\tA ;; AUTHORITY SECTION: .\t448021\tIN\tNS\tc.root-servers.net. .\t448021\tIN\tNS\tf.root-servers.net. .\t448021\tIN\tNS\tb.root-servers.net. .\t448021\tIN\tNS\tl.root-servers.net. .\t448021\tIN\tNS\ti.root-servers.net. .\t448021\tIN\tNS\tk.root-servers.net. .\t448021\tIN\tNS\tj.root-servers.net. .\t448021\tIN\tNS\th.root-servers.net. .\t448021\tIN\tNS\tg.root-servers.net. .\t448021\tIN\tNS\tm.root-servers.net. .\t448021\tIN\tNS\td.root-servers.net. .\t448021\tIN\tNS\ta.root-servers.net. .\t448021\tIN\tNS\te.root-servers.net. ;; Query time: 7 msec ;; SERVER: 119.29.29.29#53(119.29.29.29) (UDP) ;; WHEN: Thu Apr 02 23:37:21 CST 2026 ;; MSG SIZE rcvd: 258 搭建 mosdns 其实解决劫持最简单的方法，就是设置 DOH/DoH/DoT/DoQ，但我不想给局域网每一台设备单独设置，故单独在局域网一台小主机单独搭建了mosdns。\nps: 搭建之前我试过 adguardhome、SmartDNS ，可能是我姿势不对，没找到如何分流的地方。但adguardhome可视化确实很爽~\n我这里使用docker搭建。\n1、建立对应目录 1 mkdir -p ~/mosdns/rules 2、在 ~/mosdns目录建立规则文件 config.yaml 如果有条件，以下规则国外的dns设置为海外dns更好，我这里只是将海外网站让阿里doh进行解析。\n官方规则说明 已知的 DNS 提供商\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 log: level: info plugins: # ========= 规则数据 ========= - tag: geosite_cn type: domain_set args: files: - \u0026#34;/etc/mosdns/rules/geosite_cn.txt\u0026#34; # 国内域名列表/规则（domain/full/regexp...） - tag: geoip_cn type: ip_set args: files: - \u0026#34;/etc/mosdns/rules/geoip_cn.txt\u0026#34; # 国内 IP/CIDR 列表 # ========= 上游 ========= - tag: local_dns type: forward args: upstreams: # 示例：AliDNS / DNSPod DoH（按需替换） - addr: \u0026#34;223.5.5.5:53\u0026#34; - addr: \u0026#34;https://223.5.5.5/dns-query\u0026#34; - addr: \u0026#34;https://1.12.12.12/dns-query\u0026#34; - tag: remote_dns type: forward args: upstreams: # 示例：Cloudflare / Google DoH（按需替换） - addr: \u0026#34;tls://223.6.6.6:853\u0026#34; # - addr: \u0026#34;https://8.8.8.8/dns-query\u0026#34; # ========= 主处理流程 ========= - tag: main type: sequence args: # 0) 可选：缓存（按需开关/调大） - exec: cache 4096 # 1) 国内域名 → 国内上游 - matches: - qname $geosite_cn exec: $local_dns # 匹配到了则直接返回 - matches: - has_resp exec: accept # 2) 其他域名 → 先走海外上游 - exec: $remote_dns # 3) 按“应答IP”二次分流： # 如果海外上游返回的 A/AAAA 在 CN IP 段内，则丢掉应答并改用国内上游再查一次 # - matches: # - resp_ip $geoip_cn # exec: drop_resp # 4) drop_resp 后，这里再走国内上游补一次 # - exec: $local_dns # 5) 如果仍没有应答，就结束（也可以 accept/return 等） - matches: - has_resp exec: accept # ========= 监听 ========= - type: udp_server args: entry: main listen: \u0026#34;0.0.0.0:53\u0026#34; - type: tcp_server args: entry: main listen: \u0026#34;0.0.0.0:53\u0026#34; 3. 创建 geosite、geoip 规则。 以上规则文件中 /etc/mosdns/rules/geosite_cn.txt /etc/mosdns/rules/geoip_cn.txt，是需要自己下载的，mosdns不带但兼容geosite格式。\n注意: 由于 mosdns 的v5版本不再支持 geosite、geoip 原生查询了，故使用v2dat 解析 v2ray 的geosite、geoip数据包。 geosite、geoip 可在此处下载.\nv2dat 解析geoip 注意: 这里我提供的规则没有用到geoip(已被注释)，此处只是做一个记录。\n解析 geosite\n1 2 3 .\\v2dat.exe unpack geosite .\\geosite.dat -f cn # 2026-01-12T20:19:43.600+0800 INFO unpacking entry {\u0026#34;tag\u0026#34;: \u0026#34;cn\u0026#34;, \u0026#34;length\u0026#34;: 118283, \u0026#34;file\u0026#34;: \u0026#34;geosite_cn.txt\u0026#34;} 解析 geoip\n1 2 3 .\\v2dat.exe unpack geoip .\\geoip.dat -f cn # 2026-01-12T20:23:33.335+0800 INFO unpacking entry {\u0026#34;tag\u0026#34;: \u0026#34;cn\u0026#34;, \u0026#34;length\u0026#34;: 19219, \u0026#34;file\u0026#34;: \u0026#34;geoip_cn.txt\u0026#34;} 然后将v2dat运行目录下的 geosite_cn.txt、geoip_cn.txt 放到 ~/mosdns/rules目录(也就是你linux登录用户目录下的mosdns目录)。\n运行docker 1 2 3 4 5 6 docker run -d --name mosdns \\ -p 53:53/udp \\ -p 53:53/tcp \\ -v ~/mosdns:/etc/mosdns \\ -v ~/mosdns/rules:/etc/mosdns/rules \\ docker.1ms.run/irinesistiana/mosdns:latest 1、网络使用host模式性能会更好。\n2、如果不是在路由器搭建的mosdns，请记得在路由器dhcp下发dns配置那一块，设置dns为搭建mosdns的ip。\n其他想法 有想过将 mosdns 直接搭建在 cn2gia 回程的小鸡上(国内网站则解析的时候附带 ecs_ip)，可以解决污染等问题，但毕竟算提供了 DNS 服务，说不定什么时候就被墙，就算啦。\n其次是就这么公开放在互联网，感觉风险也挺大，谁都可以用你的dns，以下是我想过的“个人”用一些方法，但都不怎么好，有大佬有更好的方案，欢迎交流~\n动态IP，不好做白名单 mTLS， 或许也可以(但每台设备装证书也麻烦)，或者在局域网一台电脑安装证书，然后再搭建一个dns服务端？然后在路由器dhcp下发dns服务器为它？ VPN / WireGuard + 内网 DNS，这个不好的地方也是设备需要随时挂着vpn。 ","permalink":"https://blog.curlc.com/posts/mosdns-v5-split-dns/","summary":"\u003ch2 id=\"背景\"\u003e背景:\u003c/h2\u003e\n\u003cp\u003e最近3个月左右，只要打开任意国外网站，那么间接性会出现 DNS 解析异常的问题，表现为网页无法打开，无法解析出域名。这时使用\u003ccode\u003eping\u003c/code\u003e 则表现为 \u003ccode\u003e请求找不到主机 xxx。请检查该名称，然后重试。\u003c/code\u003e，但只要使用\u003ccode\u003enslookup\u003c/code\u003e 后则可以正常解析域名，且浏览器也可以正常打开。\u003c/p\u003e\n\u003cp\u003e但因为这种情况时有时无，所以也就一直没有去深究这个问题，直到最近实在是受不了了，决定彻底解决这个问题。\u003c/p\u003e","title":"从 DNS 异常排查到使用 mosdns v5 对国外网站进行分流解析"},{"content":"用了几年的Wordpress博客程序，直到现在，终于决定更换为Hugo了。期间也尝试过 typecho、halo、Hexo。\n原因 性能问题：当然，作为文章不多(2年没更新)，每天的访问量“个位数”的博客，没资格说性能影响了。但我也使用了super cache缓存插件，屏蔽国外字体、图片等资源，总访问速度还是感觉挺慢的。(ps: 用腻WP了,想折腾了~)\n当然服务器线路在国外，这是一个因素，性能倒不是问题(服务器配置)，毕竟跑在一台独立服务器上,由于没有启用别的服务，给wp的资源都是独享的。\n在将博客迁移到OVH的服务器上后，使用itdog的网站测速(偷个懒，没有使用JMeter测试性能)，速度还不错，在启用super cache缓存插件的情况下，\nitdog访问情况如下 服务器资源占用 可以看出，并发访问时间，CPU占用率有点高，后面考虑换成静态博客。\n选择Hugo的原因 在选择博客程序时，考虑了以下几个选项：\ntypecho：没选typecho因为没有找到一款好看的主题，还特地花了几个小时将wp的数据库导入到typecho(利用Navicat将wp、typecho 数据表导出为excel，进行批量复制/修改，再导入typecho)，但怎么看也觉得别扭，后面想了想，都是动态博客还不如就保持wp，故放弃。 Hexo：则是因为感觉生成文章很慢，但不得不说，由于是nodejs生态，很多前端都参与了Hexo主题的开发，主题好看的都挺多的。 Halo：按理说这个系统我这个javaer应该挺合适的，但实际体验下来，总感觉后台操作体验怪怪的，有点像进业务系统的感觉，想着自己写博客就联想到了业务系统，故放弃。 Hugo：说到hugo，很早之前也尝试过，但当时觉得主题不丰富(其次是主题模板怪怪的，go语法不像php好看)，没有喜欢的主题，直到最近离职后，尝试学习Go语言，顺便又回头看了看Hugo，发现也就那么回事了，能“看懂”接受了，遂决定尝试一下。 迁移过程 迁移过程其实并不复杂，就是挺费时间的，主要步骤如下：\n导出Wordpress内容：将 Wordpress 数据库导入到本地Mysql数据库。 转换格式：使用gemini-3-pro写了一个wp转md静态网页，将wp原文章，转换为Markdown格式，主要处理 标题、段落、列表、链接、图片、引用、代码块等常见WordPress元素。 设置Hugo：创建一个新的Hugo站点，选择 LoveIt 主题，并配置相应站点参数。 导入内容：将转换后的Markdown文件放入Hugo站点 的content目录中。 wp转md页面预览 未完成部分 评论迁移：目前评论还没迁移，后续考虑使用twikoo、waline、artalk等第三方评论系统, 估计使用artalk的可能性较大，因为也是go写的，性能应该不错。 域名: 目前博客域名使用的是 qyi.io，但io 每年都涨价几美元，我是19年注册的，当时35美元/年，现在已经涨到47.7美元/年(优惠后)，所以正在将.io切换为.com域名，保留几年io进行301跳转。 PS: 这io注册局越来越黑了。 自动化部署：目前是手动部署，后续考虑使用GitHub Actions / Drone 自动化部署。 结果 原博客 现博客 ","permalink":"https://blog.curlc.com/posts/blog-wordpress-to-hugo-migration/","summary":"\u003cp\u003e用了几年的Wordpress博客程序，直到现在，终于决定更换为Hugo了。期间也尝试过 typecho、halo、Hexo。\u003c/p\u003e\n\u003ch2 id=\"原因\"\u003e原因\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e性能问题\u003c/strong\u003e：当然，作为文章不多(2年没更新)，每天的访问量“个位数”的博客，没资格说性能影响了。但我也使用了\u003ccode\u003esuper cache\u003c/code\u003e缓存插件，屏蔽国外字体、图片等资源，总访问速度还是感觉挺慢的。(ps: 用腻WP了,想折腾了~)\u003c/p\u003e\n\u003cp\u003e当然服务器线路在国外，这是一个因素，性能倒不是问题(\u003ca href=\"https://blog.curlc.com/posts/purchase-ovh-ks-le-c-server/\"\u003e服务器配置\u003c/a\u003e)，毕竟跑在一台\u003ccode\u003e独立服务器上\u003c/code\u003e,由于没有启用别的服务，给wp的资源都是独享的。\u003c/p\u003e\n\u003cp\u003e在将博客迁移到OVH的服务器上后，使用itdog的网站测速(偷个懒，没有使用JMeter测试性能)，速度还不错，在启用\u003ccode\u003esuper cache\u003c/code\u003e缓存插件的情况下，\u003c/p\u003e\n\u003ch3 id=\"itdog访问情况如下\"\u003eitdog访问情况如下\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"itdog测速结果\" loading=\"lazy\" src=\"https://s3.aixfan.com/img/screenshot/2025/12/31/1767168259_63b.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"服务器资源占用\"\u003e服务器资源占用\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"服务器资源占用\" loading=\"lazy\" src=\"https://s3.aixfan.com/img/screenshot/2025/12/31/1767168273_64b.png\"\u003e\u003c/p\u003e\n\u003cp\u003e可以看出，并发访问时间，CPU占用率有点高，后面考虑换成静态博客。\u003c/p\u003e\n\u003ch2 id=\"选择hugo的原因\"\u003e选择Hugo的原因\u003c/h2\u003e\n\u003cp\u003e在选择博客程序时，考虑了以下几个选项：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003etypecho\u003c/strong\u003e：没选typecho因为没有找到一款好看的主题，还特地花了几个小时将wp的数据库导入到typecho(利用\u003ccode\u003eNavicat\u003c/code\u003e将wp、typecho 数据表导出为excel，进行批量复制/修改，再导入typecho)，但怎么看也觉得别扭，后面想了想，都是动态博客还不如就保持wp，故放弃。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHexo\u003c/strong\u003e：则是因为感觉生成文章很慢，但不得不说，由于是nodejs生态，很多前端都参与了Hexo主题的开发，主题好看的都挺多的。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHalo\u003c/strong\u003e：按理说这个系统我这个javaer应该挺合适的，但实际体验下来，总感觉后台操作体验怪怪的，有点像进业务系统的感觉，想着自己写博客就联想到了业务系统，故放弃。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHugo\u003c/strong\u003e：说到hugo，很早之前也尝试过，但当时觉得主题不丰富(其次是主题模板怪怪的，go语法不像php好看)，没有喜欢的主题，直到最近离职后，尝试学习Go语言，顺便又回头看了看Hugo，发现也就那么回事了，能“看懂”接受了，遂决定尝试一下。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"迁移过程\"\u003e迁移过程\u003c/h2\u003e\n\u003cp\u003e迁移过程其实并不复杂，就是挺费时间的，主要步骤如下：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e导出Wordpress内容\u003c/strong\u003e：将 Wordpress 数据库导入到本地Mysql数据库。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e转换格式\u003c/strong\u003e：使用\u003ccode\u003egemini-3-pro\u003c/code\u003e写了一个wp转md静态网页，将wp原文章，转换为\u003ccode\u003eMarkdown\u003c/code\u003e格式，主要处理 标题、段落、列表、链接、图片、引用、代码块等常见WordPress元素。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e设置Hugo\u003c/strong\u003e：创建一个新的Hugo站点，选择 \u003ca href=\"https://github.com/dillonzq/LoveIt\"\u003eLoveIt\u003c/a\u003e 主题，并配置相应站点参数。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e导入内容\u003c/strong\u003e：将转换后的Markdown文件放入Hugo站点 的\u003ccode\u003econtent\u003c/code\u003e目录中。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"wp转md页面预览\"\u003ewp转md页面预览\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"wp转md页面预览\" loading=\"lazy\" src=\"https://s3.aixfan.com/img/screenshot/2025/12/31/1767168289_65b.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"未完成部分\"\u003e未完成部分\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e评论迁移\u003c/strong\u003e：目前评论还没迁移，后续考虑使用\u003ccode\u003etwikoo\u003c/code\u003e、\u003ccode\u003ewaline\u003c/code\u003e、\u003ccode\u003eartalk\u003c/code\u003e等第三方评论系统, 估计使用\u003ccode\u003eartalk\u003c/code\u003e的可能性较大，因为也是go写的，性能应该不错。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e域名\u003c/strong\u003e: 目前博客域名使用的是 qyi.io，但\u003ccode\u003eio\u003c/code\u003e 每年都涨价几美元，我是19年注册的，当时35美元/年，现在已经涨到47.7美元/年(优惠后)，所以正在将\u003ccode\u003e.io\u003c/code\u003e切换为\u003ccode\u003e.com\u003c/code\u003e域名，保留几年io进行301跳转。  PS: 这io注册局越来越黑了。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e自动化部署\u003c/strong\u003e：目前是手动部署，后续考虑使用GitHub Actions / Drone 自动化部署。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"结果\"\u003e结果\u003c/h2\u003e\n\u003ch3 id=\"原博客\"\u003e原博客\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"原博客首页\" loading=\"lazy\" src=\"https://s3.aixfan.com/img/screenshot/2025/12/31/1767168305_66b.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"现博客\"\u003e现博客\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"现博客首页\" loading=\"lazy\" src=\"https://s3.aixfan.com/img/screenshot/2025/12/31/1767168318_67b.png\"\u003e\u003c/p\u003e","title":"博客程序由Wordpress更换为Hugo了"},{"content":" 这篇文章是对 https://mp.weixin.qq.com/s/ih6hhTPTAgfT0L6MLObmqA 的学习，主要是针对 RocketMQ 积压大量消息的场景，分享一些排查思路和解决方案。\n本文只聚焦判断逻辑和关键取舍，\n相关细节在 wiki RocketMQ 积压大量消息处理 中补充。\n在使用 RocketMQ 的线上系统一旦遭遇突发流量，消息系统往往最先扛不住。生产端在短时间内持续放量，而消费端与下游处理链路无法同步放大，Topic 中的消息开始堆积，延迟拉长，告警随之而来。\n这类问题如果只停留在“多加几台消费者机器”，结果通常并不理想。真正决定吞吐上限的，并不是机器数量，而是 RocketMQ 的队列模型，以及下游系统的承载边界。\n一、先把模型想清楚 在 RocketMQ 里，消息的并行能力并不是无限的。\nTopic 是逻辑分类，用来区分业务域。\nQueue 才是真正决定并行度的实体。一个 Topic 会被切成多个 Queue。\nConsumer Group 内部做负载均衡，但有一个硬约束：\n同一个 Group 中，一个 Queue 在同一时刻只能被一个 Consumer 实例消费。\n换句话说，Queue 像窗口，Consumer 像办事员。窗口不够，多来的办事员只能站着。\n这条规则，决定了很多“加机器没效果”的结局。\n二、积压从哪里来 积压本身并不神秘，本质只有一个前提：\n生产速度长期高于消费速度。\n但这句话落到系统里，往往表现为不同的形态：\n消费逻辑涉及数据库、RPC、锁竞争，单条消息处理时间被拉长； Topic 的 Queue 数量偏少，并行能力被封死； Broker 的磁盘或网络 IO 已接近极限，读写开始排队。 因此，积压不是一个原因，而是一种结果。\n三、为什么“加 Consumer”常常无效 假设一个 Topic 只有 4 个 Queue。\n4 个消费者实例：刚好每人一个 Queue。 扩到 20 个实例：仍然只有 4 个在真正干活，其余实例空转。 吞吐上限没有任何变化。\n这也是为什么单纯扩容消费者，经常看不到积压下降，甚至把下游数据库拖垮。\n四、直接扩 Queue，为什么救不了存量 直觉上，Queue 少就加 Queue。但在积压已经形成之后，这个操作对“历史消息”几乎没有帮助。\n原因很简单：\nRocketMQ 按 Queue 存储消息； 已经积压的消息，固定躺在旧 Queue 中； 新增 Queue 只对新消息生效。 所以，扩 Queue 更多是一个防止继续积压的长期手段，而不是即时止血方案。\n五、清存量的核心思路：换一条更宽的通道 当旧 Topic 的 Queue 已经成为并行瓶颈时，硬撑没有意义。\n比较可控的做法是： 把存量消息先搬出来，放到一个 Queue 足够多的新 Topic 中处理。\n这并不是“优化消费逻辑”，而是通过空间换时间。\n六、“搬运工模式”的实际落地 1）先做一件很“笨”的事：只搬，不处理 新增一个 Consumer，只做三件事：\n从旧 Topic 拉消息； 不做任何业务逻辑； 原样写入一个新 Topic（临时 Topic）。 因为不查库、不调接口，瓶颈基本只剩 IO，搬运速度通常远高于正常消费。\n旧 Topic 的积压量，会在短时间内明显下降。\n2）新 Topic 的设计目标只有一个：并行 临时 Topic 的 Queue 数，需要明显高于旧 Topic，例如 50、100。\n目的很直接： 让后续的业务消费可以被拆散到更多实例上执行。\n3）业务 Consumer 改为消费新 Topic 此时才恢复完整业务逻辑。\n由于 Queue 足够多，消费并行度被拉开，总体处理速度才真正提升。\n七、这个方案不是“无脑可用” 顺序问题 如果消息存在严格顺序要求（例如同一订单的状态流转），搬运过程中必须使用同一个业务 key 做队列路由，保证同一 key 的消息仍然落在同一个 Queue 中。\n否则，乱序带来的不是延迟，而是业务错误。\nBroker 压力 搬运意味着 Broker 同时承受大量读和写，IO 压力几乎翻倍。\n如果磁盘、网络已经接近红线，贸然搬运，很容易把 MQ 本身打挂。\n下游承载 并行度一旦拉开，最先扛不住的往往不是 MQ，而是数据库或第三方接口。\n如果积压本身就是 DB 慢导致的，放大并发只会制造二次事故。\n八、什么时候不值得“救全量” 并不是所有积压都必须清完。\n日志、埋点、非核心通知类消息，在系统已经承压的情况下，继续硬处理只会拖垮主链路。\n这时理性的选择是：\n跳过历史 offset，让系统回到实时水位； 或转存到死信队列，低峰期再处理； 必要时直接丢弃非关键数据。 系统先活下来，比数据完整更重要。\n九、事后必须追的不是“怎么清”，而是“为什么慢” 积压只是表象，真正需要复盘的是消费能力下降的根因，例如：\n慢 SQL、索引缺失、锁竞争； 外部接口 RT 拉长，引发重试风暴； 消费线程池或连接池耗尽； Topic 设计阶段缺乏容量评估； 没有削峰、限流、降级手段。 如果这些问题不解决，再清一次，还会再来一次。\n十、结论 积压的前提永远是：生产 \u0026gt; 消费 在集群消费模式下，并行度上限 = Queue 数 扩 Consumer 超过 Queue 数，必然空转 扩原 Topic 的 Queue，救不了历史消息 清存量要么优化消费本身，要么换到更多 Queue 的新通道 所有提速操作之前，先确认顺序、Broker IO、下游承载是否安全 ","permalink":"https://blog.curlc.com/posts/rocketmq-message-backlog-handling/","summary":"\u003cblockquote\u003e\n\u003cp\u003e这篇文章是对 \u003ca href=\"https://mp.weixin.qq.com/s/ih6hhTPTAgfT0L6MLObmqA\"\u003ehttps://mp.weixin.qq.com/s/ih6hhTPTAgfT0L6MLObmqA\u003c/a\u003e 的学习，主要是针对 RocketMQ 积压大量消息的场景，分享一些排查思路和解决方案。\u003c/p\u003e\n\u003c/blockquote\u003e","title":"RocketMQ 积压大量消息处理（搬运工模式）"},{"content":"最近因为个人需要(性价比还可以)，购买了一台OVH的KS-LE-C服务器，用于搭建一些测试环境和个人项目。\n唯一缺点，硬盘不是NVME，而是SATA固态，但对于我的使用场景来说，影响不大。\n购买过程 本意是想购买KS-LE-B的，但ovh提前进行了放货，并且由于很多人使用了OVH API 脚本挂着抢，导致KS-LE-B根本没见上货，这KS-LE-C还是原价从别人手里收的。\n服务器配置 这台服务器的具体配置如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 # ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## # # Yet-Another-Bench-Script # # v2025-04-20 # # https://github.com/masonr/yet-another-bench-script # # ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## # Mon Nov 24 11:35:22 UTC 2025 Basic System Information: --------------------------------- Uptime : 0 days, 1 hours, 16 minutes Processor : Intel(R) Xeon(R) CPU E5-1630 v4 @ 3.70GHz CPU cores : 8 @ 1476.470 MHz AES-NI : ✔ Enabled VM-x/AMD-V : ✔ Enabled RAM : 62.7 GiB Swap : 512.0 MiB Disk : 438.5 GiB Distro : Debian GNU/Linux 13 (trixie) Kernel : 6.12.57+deb13-amd64 VM Type : NONE IPv4/IPv6 : ✔ Online / ✔ Online IPv6 Network Information: --------------------------------- ISP : OVH SAS ASN : AS16276 OVH SAS Host : OVH SAS Location : Roubaix, Hauts-de-France (HDF) Country : France fio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/sdb3): --------------------------------- Block Size | 4k (IOPS) | 64k (IOPS) ------ | --- ---- | ---- ---- Read | 132.32 MB/s (33.0k) | 170.26 MB/s (2.6k) Write | 132.67 MB/s (33.1k) | 171.15 MB/s (2.6k) Total | 264.99 MB/s (66.2k) | 341.41 MB/s (5.3k) | | Block Size | 512k (IOPS) | 1m (IOPS) ------ | --- ---- | ---- ---- Read | 220.49 MB/s (430) | 227.37 MB/s (222) Write | 232.20 MB/s (453) | 242.52 MB/s (236) Total | 452.70 MB/s (883) | 469.89 MB/s (458) iperf3 Network Speed Tests (IPv4): --------------------------------- Provider | Location (Link) | Send Speed | Recv Speed | Ping ----- | ----- | ---- | ---- | ---- Clouvider | London, UK (10G) | 496 Mbits/sec | 941 Mbits/sec | 3.81 ms Eranium | Amsterdam, NL (100G) | 494 Mbits/sec | 939 Mbits/sec | 9.07 ms Uztelecom | Tashkent, UZ (10G) | 444 Mbits/sec | 885 Mbits/sec | 96.7 ms Leaseweb | Singapore, SG (10G) | 398 Mbits/sec | 779 Mbits/sec | 164 ms Clouvider | Los Angeles, CA, US (10G) | 431 Mbits/sec | 844 Mbits/sec | 141 ms Leaseweb | NYC, NY, US (10G) | 422 Mbits/sec | 838 Mbits/sec | 78.0 ms Edgoo | Sao Paulo, BR (1G) | 409 Mbits/sec | 809 Mbits/sec | 203 ms iperf3 Network Speed Tests (IPv6): --------------------------------- Provider | Location (Link) | Send Speed | Recv Speed | Ping ----- | ----- | ---- | ---- | ---- Clouvider | London, UK (10G) | 489 Mbits/sec | 928 Mbits/sec | 6.28 ms Eranium | Amsterdam, NL (100G) | 487 Mbits/sec | 926 Mbits/sec | 9.04 ms Uztelecom | Tashkent, UZ (10G) | 458 Mbits/sec | 856 Mbits/sec | 96.7 ms Leaseweb | Singapore, SG (10G) | 399 Mbits/sec | 657 Mbits/sec | 164 ms Clouvider | Los Angeles, CA, US (10G) | 433 Mbits/sec | 841 Mbits/sec | 141 ms Leaseweb | NYC, NY, US (10G) | 437 Mbits/sec | 828 Mbits/sec | 77.9 ms Edgoo | Sao Paulo, BR (1G) | 380 Mbits/sec | 776 Mbits/sec | 202 ms Geekbench 6 Benchmark Test: --------------------------------- Test | Value | Single Core | 1364 Multi Core | 4854 Full Test | https://browser.geekbench.com/v6/cpu/15206739 YABS completed in 13 min 20 sec 单核测试分数：1098 多核测试分数：4505 详细结果链接：https://browser.geekbench.com/v5/cpu/23936424 ","permalink":"https://blog.curlc.com/posts/purchase-ovh-ks-le-c-server/","summary":"\u003cp\u003e最近因为个人需要(性价比还可以)，购买了一台OVH的KS-LE-C服务器，用于搭建一些测试环境和个人项目。\u003c/p\u003e\n\u003cp\u003e唯一缺点，硬盘不是NVME，而是SATA固态，但对于我的使用场景来说，影响不大。\u003c/p\u003e\n\u003ch2 id=\"购买过程\"\u003e购买过程\u003c/h2\u003e\n\u003cp\u003e本意是想购买\u003ccode\u003eKS-LE-B\u003c/code\u003e的，但ovh提前进行了放货，并且由于很多人使用了OVH API 脚本挂着抢，导致KS-LE-B根本没见上货，这\u003ccode\u003eKS-LE-C\u003c/code\u003e还是原价从别人手里收的。\u003c/p\u003e\n\u003ch2 id=\"服务器配置\"\u003e服务器配置\u003c/h2\u003e\n\u003cp\u003e这台服务器的具体配置如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e83\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#              Yet-Another-Bench-Script              #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#                     v2025-04-20                    #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# https://github.com/masonr/yet-another-bench-script #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMon Nov \u003cspan class=\"m\"\u003e24\u003c/span\u003e 11:35:22 UTC \u003cspan class=\"m\"\u003e2025\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBasic System Information:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUptime     : \u003cspan class=\"m\"\u003e0\u003c/span\u003e days, \u003cspan class=\"m\"\u003e1\u003c/span\u003e hours, \u003cspan class=\"m\"\u003e16\u003c/span\u003e minutes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcessor  : Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-1630 v4 @ 3.70GHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU cores  : \u003cspan class=\"m\"\u003e8\u003c/span\u003e @ 1476.470 MHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAES-NI     : ✔ Enabled\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVM-x/AMD-V : ✔ Enabled\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRAM        : 62.7 GiB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSwap       : 512.0 MiB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDisk       : 438.5 GiB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDistro     : Debian GNU/Linux \u003cspan class=\"m\"\u003e13\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003etrixie\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eKernel     : 6.12.57+deb13-amd64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVM Type    : NONE\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIPv4/IPv6  : ✔ Online / ✔ Online\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIPv6 Network Information:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eISP        : OVH SAS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eASN        : AS16276 OVH SAS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHost       : OVH SAS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLocation   : Roubaix, Hauts-de-France \u003cspan class=\"o\"\u003e(\u003c/span\u003eHDF\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCountry    : France\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efio Disk Speed Tests \u003cspan class=\"o\"\u003e(\u003c/span\u003eMixed R/W 50/50\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003ePartition /dev/sdb3\u003cspan class=\"o\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBlock Size \u003cspan class=\"p\"\u003e|\u003c/span\u003e 4k            \u003cspan class=\"o\"\u003e(\u003c/span\u003eIOPS\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e 64k           \u003cspan class=\"o\"\u003e(\u003c/span\u003eIOPS\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ------   \u003cspan class=\"p\"\u003e|\u003c/span\u003e ---            ----  \u003cspan class=\"p\"\u003e|\u003c/span\u003e ----           ---- \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRead       \u003cspan class=\"p\"\u003e|\u003c/span\u003e 132.32 MB/s  \u003cspan class=\"o\"\u003e(\u003c/span\u003e33.0k\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e 170.26 MB/s   \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.6k\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWrite      \u003cspan class=\"p\"\u003e|\u003c/span\u003e 132.67 MB/s  \u003cspan class=\"o\"\u003e(\u003c/span\u003e33.1k\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e 171.15 MB/s   \u003cspan class=\"o\"\u003e(\u003c/span\u003e2.6k\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTotal      \u003cspan class=\"p\"\u003e|\u003c/span\u003e 264.99 MB/s  \u003cspan class=\"o\"\u003e(\u003c/span\u003e66.2k\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e 341.41 MB/s   \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.3k\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e           \u003cspan class=\"p\"\u003e|\u003c/span\u003e                      \u003cspan class=\"p\"\u003e|\u003c/span\u003e                     \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBlock Size \u003cspan class=\"p\"\u003e|\u003c/span\u003e 512k          \u003cspan class=\"o\"\u003e(\u003c/span\u003eIOPS\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e 1m            \u003cspan class=\"o\"\u003e(\u003c/span\u003eIOPS\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ------   \u003cspan class=\"p\"\u003e|\u003c/span\u003e ---            ----  \u003cspan class=\"p\"\u003e|\u003c/span\u003e ----           ---- \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRead       \u003cspan class=\"p\"\u003e|\u003c/span\u003e 220.49 MB/s    \u003cspan class=\"o\"\u003e(\u003c/span\u003e430\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e 227.37 MB/s    \u003cspan class=\"o\"\u003e(\u003c/span\u003e222\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWrite      \u003cspan class=\"p\"\u003e|\u003c/span\u003e 232.20 MB/s    \u003cspan class=\"o\"\u003e(\u003c/span\u003e453\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e 242.52 MB/s    \u003cspan class=\"o\"\u003e(\u003c/span\u003e236\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTotal      \u003cspan class=\"p\"\u003e|\u003c/span\u003e 452.70 MB/s    \u003cspan class=\"o\"\u003e(\u003c/span\u003e883\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e 469.89 MB/s    \u003cspan class=\"o\"\u003e(\u003c/span\u003e458\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eiperf3 Network Speed Tests \u003cspan class=\"o\"\u003e(\u003c/span\u003eIPv4\u003cspan class=\"o\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProvider        \u003cspan class=\"p\"\u003e|\u003c/span\u003e Location \u003cspan class=\"o\"\u003e(\u003c/span\u003eLink\u003cspan class=\"o\"\u003e)\u003c/span\u003e           \u003cspan class=\"p\"\u003e|\u003c/span\u003e Send Speed      \u003cspan class=\"p\"\u003e|\u003c/span\u003e Recv Speed      \u003cspan class=\"p\"\u003e|\u003c/span\u003e Ping           \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-----           \u003cspan class=\"p\"\u003e|\u003c/span\u003e -----                     \u003cspan class=\"p\"\u003e|\u003c/span\u003e ----            \u003cspan class=\"p\"\u003e|\u003c/span\u003e ----            \u003cspan class=\"p\"\u003e|\u003c/span\u003e ----           \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eClouvider       \u003cspan class=\"p\"\u003e|\u003c/span\u003e London, UK \u003cspan class=\"o\"\u003e(\u003c/span\u003e10G\u003cspan class=\"o\"\u003e)\u003c/span\u003e          \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e496\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e941\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e 3.81 ms        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEranium         \u003cspan class=\"p\"\u003e|\u003c/span\u003e Amsterdam, NL \u003cspan class=\"o\"\u003e(\u003c/span\u003e100G\u003cspan class=\"o\"\u003e)\u003c/span\u003e      \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e494\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e939\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e 9.07 ms        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUztelecom       \u003cspan class=\"p\"\u003e|\u003c/span\u003e Tashkent, UZ \u003cspan class=\"o\"\u003e(\u003c/span\u003e10G\u003cspan class=\"o\"\u003e)\u003c/span\u003e        \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e444\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e885\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e 96.7 ms        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLeaseweb        \u003cspan class=\"p\"\u003e|\u003c/span\u003e Singapore, SG \u003cspan class=\"o\"\u003e(\u003c/span\u003e10G\u003cspan class=\"o\"\u003e)\u003c/span\u003e       \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e398\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e779\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e164\u003c/span\u003e ms         \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eClouvider       \u003cspan class=\"p\"\u003e|\u003c/span\u003e Los Angeles, CA, US \u003cspan class=\"o\"\u003e(\u003c/span\u003e10G\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e431\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e844\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e141\u003c/span\u003e ms         \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLeaseweb        \u003cspan class=\"p\"\u003e|\u003c/span\u003e NYC, NY, US \u003cspan class=\"o\"\u003e(\u003c/span\u003e10G\u003cspan class=\"o\"\u003e)\u003c/span\u003e         \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e422\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e838\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e 78.0 ms        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEdgoo           \u003cspan class=\"p\"\u003e|\u003c/span\u003e Sao Paulo, BR \u003cspan class=\"o\"\u003e(\u003c/span\u003e1G\u003cspan class=\"o\"\u003e)\u003c/span\u003e        \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e409\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e809\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e203\u003c/span\u003e ms         \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eiperf3 Network Speed Tests \u003cspan class=\"o\"\u003e(\u003c/span\u003eIPv6\u003cspan class=\"o\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProvider        \u003cspan class=\"p\"\u003e|\u003c/span\u003e Location \u003cspan class=\"o\"\u003e(\u003c/span\u003eLink\u003cspan class=\"o\"\u003e)\u003c/span\u003e           \u003cspan class=\"p\"\u003e|\u003c/span\u003e Send Speed      \u003cspan class=\"p\"\u003e|\u003c/span\u003e Recv Speed      \u003cspan class=\"p\"\u003e|\u003c/span\u003e Ping           \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-----           \u003cspan class=\"p\"\u003e|\u003c/span\u003e -----                     \u003cspan class=\"p\"\u003e|\u003c/span\u003e ----            \u003cspan class=\"p\"\u003e|\u003c/span\u003e ----            \u003cspan class=\"p\"\u003e|\u003c/span\u003e ----           \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eClouvider       \u003cspan class=\"p\"\u003e|\u003c/span\u003e London, UK \u003cspan class=\"o\"\u003e(\u003c/span\u003e10G\u003cspan class=\"o\"\u003e)\u003c/span\u003e          \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e489\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e928\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e 6.28 ms        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEranium         \u003cspan class=\"p\"\u003e|\u003c/span\u003e Amsterdam, NL \u003cspan class=\"o\"\u003e(\u003c/span\u003e100G\u003cspan class=\"o\"\u003e)\u003c/span\u003e      \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e487\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e926\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e 9.04 ms        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUztelecom       \u003cspan class=\"p\"\u003e|\u003c/span\u003e Tashkent, UZ \u003cspan class=\"o\"\u003e(\u003c/span\u003e10G\u003cspan class=\"o\"\u003e)\u003c/span\u003e        \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e458\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e856\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e 96.7 ms        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLeaseweb        \u003cspan class=\"p\"\u003e|\u003c/span\u003e Singapore, SG \u003cspan class=\"o\"\u003e(\u003c/span\u003e10G\u003cspan class=\"o\"\u003e)\u003c/span\u003e       \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e399\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e657\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e164\u003c/span\u003e ms         \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eClouvider       \u003cspan class=\"p\"\u003e|\u003c/span\u003e Los Angeles, CA, US \u003cspan class=\"o\"\u003e(\u003c/span\u003e10G\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e433\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e841\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e141\u003c/span\u003e ms         \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLeaseweb        \u003cspan class=\"p\"\u003e|\u003c/span\u003e NYC, NY, US \u003cspan class=\"o\"\u003e(\u003c/span\u003e10G\u003cspan class=\"o\"\u003e)\u003c/span\u003e         \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e437\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e828\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e 77.9 ms        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEdgoo           \u003cspan class=\"p\"\u003e|\u003c/span\u003e Sao Paulo, BR \u003cspan class=\"o\"\u003e(\u003c/span\u003e1G\u003cspan class=\"o\"\u003e)\u003c/span\u003e        \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e380\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e776\u003c/span\u003e Mbits/sec   \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e202\u003c/span\u003e ms         \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGeekbench \u003cspan class=\"m\"\u003e6\u003c/span\u003e Benchmark Test:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTest            \u003cspan class=\"p\"\u003e|\u003c/span\u003e Value                         \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e|\u003c/span\u003e                               \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSingle Core     \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e1364\u003c/span\u003e                          \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMulti Core      \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"m\"\u003e4854\u003c/span\u003e                          \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFull Test       \u003cspan class=\"p\"\u003e|\u003c/span\u003e https://browser.geekbench.com/v6/cpu/15206739\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eYABS completed in \u003cspan class=\"m\"\u003e13\u003c/span\u003e min \u003cspan class=\"m\"\u003e20\u003c/span\u003e sec\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e单核测试分数：1098\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e多核测试分数：4505\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e详细结果链接：https://browser.geekbench.com/v5/cpu/23936424\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"购买了一台OVH KS-LE-C 服务器"},{"content":"本篇文章以MinIO作为文件服务端，其他基于S3协议的文件服务也一样。\n通过接口返回文件地址给前端时，可以结合 S3 的预签名 URL 或 STS（临时凭证） 来实现安全访问。\n核心思路 接口返回的文件地址不直接暴露 MinIO 存储路径。 在返回文件地址前，通过后端生成 预签名 URL 或 动态临时凭证。 前端使用该地址访问文件，确保文件访问受到权限和时间限制。 实现方法 1：基于预签名 URL 1.1 后端生成预签名 URL 使用 MinIO 提供的 SDK，在接口中动态生成带有时间限制的预签名 URL，并返回给前端。\nJava 示例代码：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 import io.minio.MinioClient; import io.minio.GetPresignedObjectUrlArgs; import io.minio.http.Method; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class FileController { private final MinioClient minioClient; public FileController() { this.minioClient = MinioClient.builder() .endpoint(\u0026#34;https://your-minio-server.com\u0026#34;) .credentials(\u0026#34;ACCESS_KEY\u0026#34;, \u0026#34;SECRET_KEY\u0026#34;) .build(); } @GetMapping(\u0026#34;/api/getFileUrl\u0026#34;) public String getFileUrl(@RequestParam String bucketName, @RequestParam String objectName) { try { // 生成预签名 URL（有效期 1 小时） String url = minioClient.getPresignedObjectUrl( GetPresignedObjectUrlArgs.builder() .method(Method.GET) .bucket(bucketName) .object(objectName) .expiry(60 * 60) // 有效期：1小时 .build() ); return url; } catch (Exception e) { e.printStackTrace(); return \u0026#34;Error generating URL\u0026#34;; } } } 1.2 接口返回示例 前端调用 /api/getFileUrl，后端返回：\n1 2 3 { \u0026#34;fileUrl\u0026#34;: \u0026#34;https://your-minio-server.com/bucket-name/object-name?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026amp;X-Amz-Credential=...\u0026#34; } 优点：\n预签名 URL 确保文件只能在指定时间内访问，过期后失效。 URL 绑定文件路径和权限，防止未授权访问。 缺点：\n不适合需要频繁访问多个文件的场景。 每次访问都需要重新生成 URL，增加后端负载。 仅适用于单次访问的场景。 实现方法 2：基于临时凭证（STS） 2.1 动态生成临时凭证 MinIO 支持通过 STS（Security Token Service）生成短时有效的临时访问凭证。\nJava 生成临时凭证示例：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import io.minio.MinioClient; import io.minio.credentials.AssumeRoleProvider; import io.minio.credentials.Provider; public class StsTokenService { private final MinioClient minioClient; public StsTokenService() { this.minioClient = MinioClient.builder() .endpoint(\u0026#34;https://your-minio-server.com\u0026#34;) .credentials(\u0026#34;ACCESS_KEY\u0026#34;, \u0026#34;SECRET_KEY\u0026#34;) .build(); } public Provider getTemporaryToken() throws Exception { AssumeRoleProvider provider = AssumeRoleProvider.builder() .client(minioClient) .durationSeconds(3600) // 临时凭证有效期 .build(); return provider; } } 2.2 返回临时凭证 在接口中返回包含 AccessKey, SecretKey 和 SessionToken 的临时凭证给前端。\n接口返回示例：\n1 2 3 4 5 6 7 { \u0026#34;accessKey\u0026#34;: \u0026#34;temp-access-key\u0026#34;, \u0026#34;secretKey\u0026#34;: \u0026#34;temp-secret-key\u0026#34;, \u0026#34;sessionToken\u0026#34;: \u0026#34;temp-session-token\u0026#34;, \u0026#34;bucketName\u0026#34;: \u0026#34;your-bucket-name\u0026#34;, \u0026#34;region\u0026#34;: \u0026#34;your-region\u0026#34; } 2.3 前端 SDK 使用临时凭证 前端使用临时凭证通过 SDK 访问 MinIO 文件。\nJavaScript 示例：\n1 2 3 4 5 6 7 8 9 10 11 12 13 const minioClient = new Minio.Client({ endPoint: \u0026#39;your-minio-server.com\u0026#39;, accessKey: \u0026#39;temp-access-key\u0026#39;, secretKey: \u0026#39;temp-secret-key\u0026#39;, sessionToken: \u0026#39;temp-session-token\u0026#39; }); minioClient.getObject(\u0026#39;your-bucket-name\u0026#39;, \u0026#39;object-name\u0026#39;, function(err, dataStream) { if (err) { return console.log(err); } dataStream.pipe(fs.createWriteStream(\u0026#39;downloaded-file.jpg\u0026#39;)); }); 优点：\n临时凭证可以限制权限和有效期，提升安全性。 适用于需要频繁访问多个文件的场景。 前端可以直接使用 SDK 进行文件操作。 缺点：\n临时凭证泄露风险较高，需妥善管理。 增加了前端实现的复杂度。 需要处理凭证的刷新和过期问题。 不适合只需单次访问的场景。 实现方法 3：后端代理文件请求 如果不想直接暴露文件路径或生成签名 URL，可以通过后端接口代理文件的下载请求。\nSpring Boot 示例：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @GetMapping(\u0026#34;/api/download\u0026#34;) public ResponseEntity\u0026lt;Resource\u0026gt; downloadFile(@RequestParam String bucketName, @RequestParam String objectName) { try { InputStream fileStream = minioClient.getObject( GetObjectArgs.builder() .bucket(bucketName) .object(objectName) .build() ); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, \u0026#34;attachment; filename=\u0026#34; + objectName) .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(new InputStreamResource(fileStream)); } catch (Exception e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } 前端访问 /api/download，后端完成文件下载逻辑，同时可以控制访问权限。\n优点：\n完全控制文件访问权限。 不暴露任何 MinIO 相关信息。 适用于需要复杂权限控制的场景。 缺点：\n增加了后端负载，可能影响性能。 需要处理大文件传输的效率问题。 ","permalink":"https://blog.curlc.com/posts/s3-file-sharing-permissions/","summary":"\u003cp\u003e本篇文章以\u003ccode\u003eMinIO\u003c/code\u003e作为文件服务端，其他基于S3协议的文件服务也一样。\u003c/p\u003e\n\u003cp\u003e通过接口返回文件地址给前端时，可以结合 \u003cstrong\u003eS3 的预签名 URL\u003c/strong\u003e 或 \u003cstrong\u003eSTS（临时凭证）\u003c/strong\u003e 来实现安全访问。\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"核心思路\"\u003e核心思路\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e接口返回的文件地址不直接暴露 MinIO 存储路径\u003c/strong\u003e。\u003c/li\u003e\n\u003cli\u003e在返回文件地址前，通过后端生成 \u003cstrong\u003e预签名 URL\u003c/strong\u003e 或 \u003cstrong\u003e动态临时凭证\u003c/strong\u003e。\u003c/li\u003e\n\u003cli\u003e前端使用该地址访问文件，确保文件访问受到权限和时间限制。\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch3 id=\"实现方法-1基于预签名-url\"\u003e实现方法 1：基于预签名 URL\u003c/h3\u003e\n\u003ch4 id=\"11-后端生成预签名-url\"\u003e1.1 后端生成预签名 URL\u003c/h4\u003e\n\u003cp\u003e使用 MinIO 提供的 SDK，在接口中动态生成带有时间限制的预签名 URL，并返回给前端。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eJava 示例代码：\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003eio.minio.MinioClient\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003eio.minio.GetPresignedObjectUrlArgs\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003eio.minio.http.Method\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003eorg.springframework.web.bind.annotation.GetMapping\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003eorg.springframework.web.bind.annotation.RequestParam\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003eorg.springframework.web.bind.annotation.RestController\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@RestController\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eFileController\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efinal\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMinioClient\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eminioClient\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eFileController\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eminioClient\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMinioClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eendpoint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://your-minio-server.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ecredentials\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;ACCESS_KEY\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;SECRET_KEY\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nd\"\u003e@GetMapping\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/api/getFileUrl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egetFileUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nd\"\u003e@RequestParam\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebucketName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nd\"\u003e@RequestParam\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eobjectName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 生成预签名 URL（有效期 1 小时）\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eminioClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetPresignedObjectUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"n\"\u003eGetPresignedObjectUrlArgs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMethod\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eGET\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ebucket\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebucketName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eobject\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eexpiry\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e60\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003e60\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 有效期：1小时\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Error generating URL\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch4 id=\"12-接口返回示例\"\u003e1.2 接口返回示例\u003c/h4\u003e\n\u003cp\u003e前端调用 \u003ccode\u003e/api/getFileUrl\u003c/code\u003e，后端返回：\u003c/p\u003e","title":"基于S3协议对外分享文件权限管理方案"},{"content":"当执行 docker login xxx.xxx.xxx 命令后，Docker 客户端会尝试登录到指定的镜像仓库 xxx.xxx.xxx，并提示输入用户名和密码（如果该仓库需要身份验证）。成功登录后，Docker 会将登录凭证存储在本地（通常在 ~/.docker/config.json 文件中），以便后续操作（如拉取镜像或推送镜像）可以自动使用这些凭证。\n对拉取镜像的具体变化 执行 docker login xxx.xxx.xxx 后，拉取镜像时的变化取决于以下几个方面：\n访问私有镜像\n如果 xxx.xxx.xxx 是一个私有镜像仓库，并且之前没有登录，那么在登录之前尝试拉取该仓库中的私有镜像会失败（通常会收到 unauthorized: authentication required 的错误）。登录成功后，可以拉取该仓库中有权限访问的私有镜像。例如：\n1 docker pull xxx.xxx.xxx/my-private-image:latest 在登录后，Docker 会使用存储的凭证自动完成身份验证，拉取过程会顺利进行。\n加速镜像拉取（如果它是镜像代理）\n如果 xxx.xxx.xxx 是一个镜像加速服务（类似于国内的镜像源，如阿里云、DaoCloud 等），登录后可能会影响从该仓库拉取镜像的速度。许多加速服务会代理 Docker Hub 的官方镜像，登录后可以通过该服务更快地下载镜像。例如：\n1 docker pull xxx.xxx.xxx/library/ubuntu:latest 这里假设 xxx.xxx.xxx 代理了 Docker Hub 的 ubuntu 镜像，拉取速度可能会比直接从 registry-1.docker.io（Docker Hub 默认地址）更快，具体取决于网络环境和该服务的性能。\n无变化的情况\n如果登录后仍然拉取的是其他仓库的镜像（例如默认的 Docker Hub 镜像 ubuntu:latest），并且没有配置 xxx.xxx.xxx 作为镜像源，那么拉取镜像的行为不会有任何变化。登录仅对 xxx.xxx.xxx 仓库的操作生效。\n拉取镜像的行为 在默认情况下，如果执行：\n1 docker pull ubuntu:latest Docker 会从官方镜像仓库（即 Docker Hub，地址为 registry-1.docker.io）拉取 ubuntu:latest 镜像，而不是从 xxx.xxx.xxx 拉取。原因如下：\n默认行为 当运行 docker pull ubuntu:latest 时，Docker 会解析镜像名称： 如果镜像名称中没有显式指定仓库地址（例如 xxx.xxx.xxx/ubuntu:latest），Docker 默认假设镜像来自 Docker Hub。 ubuntu:latest 是 Docker Hub 上官方镜像 library/ubuntu 的简写形式，因此会直接从 registry-1.docker.io/library/ubuntu:latest 拉取。 docker login xxx.xxx.xxx 的影响 执行 docker login xxx.xxx.xxx 只是让登录到 xxx.xxx.xxx 这个特定的仓库，并存储其凭证。 它并不会改变 Docker 的默认镜像源，也不会自动将所有镜像拉取请求重定向到 xxx.xxx.xxx。 登录的效果仅在显式拉取 xxx.xxx.xxx 上的镜像时生效，例如： 1 docker pull xxx.xxx.xxx/ubuntu:latest 这时才会从 xxx.xxx.xxx 拉取镜像（假设该仓库提供了 ubuntu:latest）。 如何让 docker pull ubuntu:latest 从 xxx.xxx.xxx 拉取？ 如果希望 docker pull ubuntu:latest 从 xxx.xxx.xxx 拉取镜像，需要额外配置 Docker 的镜像源（registry mirror）。具体步骤如下：\n编辑 Docker 配置文件 /etc/docker/daemon.json（如果没有该文件，可以创建）： 1 2 3 { \u0026#34;registry-mirrors\u0026#34;: [\u0026#34;https://xxx.xxx.xxx\u0026#34;] } 保存文件后，重启 Docker 服务： 1 2 sudo systemctl daemon-reload sudo systemctl restart docker 配置完成后，Docker 会将 xxx.xxx.xxx 作为镜像加速器。当运行 docker pull ubuntu:latest 时，Docker 会优先尝试从 xxx.xxx.xxx 获取镜像。如果 xxx.xxx.xxx 提供了 ubuntu:latest 的代理副本，就会从那里拉取；否则，它会回退到 Docker Hub。 ","permalink":"https://blog.curlc.com/posts/docker-login-impact/","summary":"\u003cp\u003e当执行 \u003ccode\u003edocker login xxx.xxx.xxx\u003c/code\u003e 命令后，Docker 客户端会尝试登录到指定的镜像仓库 \u003ccode\u003exxx.xxx.xxx\u003c/code\u003e，并提示输入用户名和密码（如果该仓库需要身份验证）。成功登录后，Docker 会将登录凭证存储在本地（通常在 \u003ccode\u003e~/.docker/config.json\u003c/code\u003e 文件中），以便后续操作（如拉取镜像或推送镜像）可以自动使用这些凭证。\u003c/p\u003e\n\u003ch3 id=\"对拉取镜像的具体变化\"\u003e对拉取镜像的具体变化\u003c/h3\u003e\n\u003cp\u003e执行 \u003ccode\u003edocker login xxx.xxx.xxx\u003c/code\u003e 后，拉取镜像时的变化取决于以下几个方面：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e访问私有镜像\u003c/strong\u003e\u003cbr\u003e\n如果 \u003ccode\u003exxx.xxx.xxx\u003c/code\u003e 是一个私有镜像仓库，并且之前没有登录，那么在登录之前尝试拉取该仓库中的私有镜像会失败（通常会收到 \u003ccode\u003eunauthorized: authentication required\u003c/code\u003e 的错误）。登录成功后，可以拉取该仓库中有权限访问的私有镜像。例如：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker pull xxx.xxx.xxx/my-private-image:latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e在登录后，Docker 会使用存储的凭证自动完成身份验证，拉取过程会顺利进行。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e加速镜像拉取（如果它是镜像代理）\u003c/strong\u003e\u003cbr\u003e\n如果 \u003ccode\u003exxx.xxx.xxx\u003c/code\u003e 是一个镜像加速服务（类似于国内的镜像源，如阿里云、DaoCloud 等），登录后可能会影响从该仓库拉取镜像的速度。许多加速服务会代理 Docker Hub 的官方镜像，登录后可以通过该服务更快地下载镜像。例如：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker pull xxx.xxx.xxx/library/ubuntu:latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e这里假设 \u003ccode\u003exxx.xxx.xxx\u003c/code\u003e 代理了 Docker Hub 的 \u003ccode\u003eubuntu\u003c/code\u003e 镜像，拉取速度可能会比直接从 \u003ccode\u003eregistry-1.docker.io\u003c/code\u003e（Docker Hub 默认地址）更快，具体取决于网络环境和该服务的性能。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e无变化的情况\u003c/strong\u003e\u003cbr\u003e\n如果登录后仍然拉取的是其他仓库的镜像（例如默认的 Docker Hub 镜像 \u003ccode\u003eubuntu:latest\u003c/code\u003e），并且没有配置 \u003ccode\u003exxx.xxx.xxx\u003c/code\u003e 作为镜像源，那么拉取镜像的行为不会有任何变化。登录仅对 \u003ccode\u003exxx.xxx.xxx\u003c/code\u003e 仓库的操作生效。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"拉取镜像的行为\"\u003e拉取镜像的行为\u003c/h2\u003e\n\u003cp\u003e在默认情况下，如果执行：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker pull ubuntu:latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eDocker 会从官方镜像仓库（即 Docker Hub，地址为 \u003ccode\u003eregistry-1.docker.io\u003c/code\u003e）拉取 \u003ccode\u003eubuntu:latest\u003c/code\u003e 镜像，而不是从 \u003ccode\u003exxx.xxx.xxx\u003c/code\u003e 拉取。原因如下：\u003c/p\u003e","title":"docker login 执行之后的影响"},{"content":"在 Nginx 中，如果客户端请求的域名未在 server_name 指定的配置中匹配，Nginx 仍然会将请求转发到默认的 server 块。为了防止非 server_name 配置的域名访问，可以使用以下几种方法：\n方法 1：使用默认 server 块拦截未匹配的域名 在 Nginx 配置文件中（通常是 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf），添加一个默认的 server 块，只允许 server_name 明确配置的域名访问，其他所有未匹配的域名都返回 444（直接断开连接）。\n1 2 3 4 5 6 7 server { listen 80 default_server; listen [::]:80 default_server; server_name _; return 444; } 解释 listen 80 default_server;：表示该 server 块是默认的服务器，所有未匹配的请求都会进入这里。 server_name _;：这个 _ 是一个通配符，表示未匹配的任何域名都会进入该 server 块。 return 444;：返回 444 状态码，直接断开连接，不给客户端任何响应，提高安全性。 方法 2：使用 if 语句在特定 server 块中拦截 如果不想使用默认 server 块，也可以在你的业务 server 块中检查 Host 头，拒绝非指定域名的访问。\n1 2 3 4 5 6 7 8 9 10 11 12 server { listen 80; server_name example.com www.example.com; if ($host !~* ^(example\\.com|www\\.example\\.com)$) { return 403; } location / { proxy_pass http://127.0.0.1:8080; } } 解释 if ($host !~* ^(example\\.com|www\\.example\\.com)$)：检查 Host 头，如果不符合 example.com 或 www.example.com，则返回 403 Forbidden。 return 403;：拒绝访问。 ⚠️ 注意：Nginx 官方不推荐 if 语句用于控制访问，但在简单场景下可以使用。\n方法 3：监听特定 IP，限制非指定域名访问 如果服务器有多个 IP，可以让 Nginx 只监听特定 IP，并通过 server_name 控制。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 server { listen 80; server_name example.com www.example.com; location / { proxy_pass http://127.0.0.1:8080; } } server { listen 80; server_name _; # 未匹配的所有请求 return 444; # 直接断开连接 } 方法 4：针对 HTTPS 限制非 server_name 访问 如果使用 HTTPS，并且不希望未配置的域名访问你的服务器，可以使用以下方式：\n1 2 3 4 5 6 7 8 9 server { listen 443 ssl default_server; server_name _; ssl_certificate /etc/nginx/ssl/default.crt; ssl_certificate_key /etc/nginx/ssl/default.key; return 444; } 解释 让 default_server 处理所有未匹配的域名。 使用一个默认的 SSL 证书（可以是一个无效或自签名证书）。 直接返回 444，防止服务器暴露给未授权的访问者。 如何生成自签名 SSL 证书？ 1 2 3 4 5 mkdir -p /etc/nginx/ssl openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \\ -keyout /etc/nginx/ssl/default.key \\ -out /etc/nginx/ssl/default.crt \\ -subj \u0026#34;/C=CN/ST=Beijing/L=Beijing/O=Default/CN=default\u0026#34; 总结 如果希望完全禁止未配置 server_name 的域名访问，推荐使用 方法 1（默认 server 块拦截）或 方法 3（监听特定 IP），它们是 Nginx 官方推荐的方式，性能最好，配置最清晰。\n如果有更复杂的需求（如某些域名返回 403，其他域名正常访问），可以使用 方法 2（if 语句检查 $host）。对于 HTTPS，使用 方法 4 结合默认 server 块。\n","permalink":"https://blog.curlc.com/posts/nginx-prevent-non-server-name-access/","summary":"\u003cp\u003e在 Nginx 中，如果客户端请求的域名未在 \u003ccode\u003eserver_name\u003c/code\u003e 指定的配置中匹配，Nginx 仍然会将请求转发到默认的 \u003ccode\u003eserver\u003c/code\u003e 块。为了防止非 \u003ccode\u003eserver_name\u003c/code\u003e 配置的域名访问，可以使用以下几种方法：\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"方法-1使用默认\"\u003e\u003cstrong\u003e方法 1：使用默认 \u003ccode\u003eserver\u003c/code\u003e 块拦截未匹配的域名\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e在 Nginx 配置文件中（通常是 \u003ccode\u003e/etc/nginx/nginx.conf\u003c/code\u003e 或 \u003ccode\u003e/etc/nginx/conf.d/default.conf\u003c/code\u003e），添加一个默认的 \u003ccode\u003eserver\u003c/code\u003e 块，只允许 \u003ccode\u003eserver_name\u003c/code\u003e 明确配置的域名访问，其他所有未匹配的域名都返回 444（直接断开连接）。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eserver\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e \u003cspan class=\"s\"\u003edefault_server\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"s\"\u003e[::]:80\u003c/span\u003e \u003cspan class=\"s\"\u003edefault_server\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eserver_name\u003c/span\u003e \u003cspan class=\"s\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e444\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"解释\"\u003e\u003cstrong\u003e解释\u003c/strong\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003elisten 80 default_server;\u003c/code\u003e：表示该 \u003ccode\u003eserver\u003c/code\u003e 块是默认的服务器，所有未匹配的请求都会进入这里。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eserver_name _;\u003c/code\u003e：这个 \u003ccode\u003e_\u003c/code\u003e 是一个通配符，表示未匹配的任何域名都会进入该 \u003ccode\u003eserver\u003c/code\u003e 块。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ereturn 444;\u003c/code\u003e：返回 444 状态码，直接断开连接，不给客户端任何响应，提高安全性。\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"方法-2使用\"\u003e\u003cstrong\u003e方法 2：使用 \u003ccode\u003eif\u003c/code\u003e 语句在特定 \u003ccode\u003eserver\u003c/code\u003e 块中拦截\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e如果不想使用默认 \u003ccode\u003eserver\u003c/code\u003e 块，也可以在你的业务 \u003ccode\u003eserver\u003c/code\u003e 块中检查 \u003ccode\u003eHost\u003c/code\u003e 头，拒绝非指定域名的访问。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eserver\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elisten\u003c/span\u003e \u003cspan class=\"mi\"\u003e80\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eserver_name\u003c/span\u003e \u003cspan class=\"s\"\u003eexample.com\u003c/span\u003e \u003cspan class=\"s\"\u003ewww.example.com\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003eif\u003c/span\u003e \u003cspan class=\"s\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$host\u003c/span\u003e \u003cspan class=\"s\"\u003e!~*\u003c/span\u003e \u003cspan class=\"s\"\u003e^(example\\.com|www\\.example\\.com)\u003c/span\u003e$\u003cspan class=\"s\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e403\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kn\"\u003elocation\u003c/span\u003e \u003cspan class=\"s\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kn\"\u003eproxy_pass\u003c/span\u003e \u003cspan class=\"s\"\u003ehttp://127.0.0.1:8080\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"解释-1\"\u003e\u003cstrong\u003e解释\u003c/strong\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eif ($host !~* ^(example\\.com|www\\.example\\.com)$)\u003c/code\u003e：检查 \u003ccode\u003eHost\u003c/code\u003e 头，如果不符合 \u003ccode\u003eexample.com\u003c/code\u003e 或 \u003ccode\u003ewww.example.com\u003c/code\u003e，则返回 \u003ccode\u003e403 Forbidden\u003c/code\u003e。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ereturn 403;\u003c/code\u003e：拒绝访问。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⚠️ \u003cstrong\u003e注意\u003c/strong\u003e：Nginx 官方不推荐 \u003ccode\u003eif\u003c/code\u003e 语句用于控制访问，但在简单场景下可以使用。\u003c/p\u003e","title":"nginx如何防止非 server_name 配置的域名访问"},{"content":"Linux docker、docker-compose安装命令\n使用官方安装脚本自动安装 1 2 3 4 5 安装命令如下： curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 也可以使用国内 daocloud 一键安装命令： curl -sSL https://get.daocloud.io/docker | sh alinux系统安装Docker https://help.aliyun.com/zh/ecs/use-cases/install-and-use-docker\n1 2 3 4 5 6 7 8 9 10 11 #添加Docker软件包源 sudo wget -O /etc/yum.repos.d/docker-ce.repo http://mirrors.cloud.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i \u0026#39;s|https://mirrors.aliyun.com|http://mirrors.cloud.aliyuncs.com|g\u0026#39; /etc/yum.repos.d/docker-ce.repo #Alibaba Cloud Linux3专用的dnf源兼容插件 sudo dnf -y install dnf-plugin-releasever-adapter --repo alinux3-plus #安装Docker社区版本，容器运行时containerd.io，以及Docker构建和Compose插件 sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin #启动Docker sudo systemctl start docker #设置Docker守护进程在系统启动时自动启动 sudo systemctl enable docker 安装docker-compose 1 2 3 4 5 6 7 curl -L \u0026#34;https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-$(uname -s)-$(uname -m)\u0026#34; -o /usr/local/bin/docker-compose https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64 mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose cp -rf /usr/local/bin/docker-compose /usr/bin/docker-compose docker自启 1 systemctl enable docker 容器自启 1 docker restart imageid 在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启：\n1 docker run --restart=always 如果已经启动了则可以使用如下命令：\n1 docker update --restart=always \u0026lt;CONTAINER ID\u0026gt; ","permalink":"https://blog.curlc.com/posts/docker-install/","summary":"\u003cp\u003eLinux docker、docker-compose安装命令\u003c/p\u003e","title":"Docker-安装"},{"content":"开发过程中常用镜像。\nrabbitmq 1 2 3 4 5 6 7 #设置默认用户和密码 #如果您想更改默认的用户名和密码 guest / guest，你可以这样做 RABBITMQ_DEFAULT_USER和 RABBITMQ_DEFAULT_PASS环境变量。 这些变量以前在特定于 docker 的入口点 shell 脚本中可用，但现在可直接在 RabbitMQ 中使用。 docker run -d -p 5672:5672 -p 15672:15672 --name some-rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=password### rabbitmq:3-management 设置默认虚拟主机 docker run -d --name some-rabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost rabbitmq:3-management ​mariadb​​​​ 1 2 3 4 5 6 7 8 docker run -d \\ -p 3308:3306 \\ -v /data/mariadb/data:/var/lib/mysql \\ --name some-mariadb \\ --env MARIADB_USER=mc5l \\ --env MARIADB_PASSWORD=EHk5PYsaewq!@3ff \\ --env MARIADB_ROOT_PASSWORD=EHk5PYFbFs%3e \\ mariadb:latest seaweedfs 1 2 3 wget https://raw.githubusercontent.com/chrislusf/seaweedfs/master/docker/seaweedfs-compose.yml docker-compose -f seaweedfs-compose.yml -p seaweedfs up mongodb 1 docker run -d --name mongodb -v /data/mongodb/datadb:/data/db -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=admin --privileged=true mongo:lates postgresql 1 2 3 4 5 6 7 8 9 10 docker run -d \\ --network my_network \\ -e POSTGRES_PASSWORD=secret \\ -e POSTGRES_USER=redmine \\ --name some-postgres \\ -restart always \\ postgres 新版本 \\镜像\\postgresql 新版本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 version: \u0026#39;2\u0026#39; services: postgres: restart: always image: postgres:14.4 container_name: postgres14.4 ports: - \u0026#34;5432:5432\u0026#34; volumes: - \u0026#34;/data/postgres14_4:/var/lib/postgresql/data\u0026#34; - \u0026#34;$PWD/pgsql/postgresql.conf:/etc/postgresql/postgresql.conf\u0026#34; environment: PGDATA: /var/lib/postgresql/data/pgdata POSTGRES_PASSWORD: dev@123, POSTGRES_DB: postgres TZ: Asia/Shanghai networks: default: ipv4_address: 172.25.0.103 SqlServer2019 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #创建主机映射目录 mkdir -p /data/sqlserver2019_data #修改主机映射目录权限 chown -R 10001:0 /data/sqlserver2019_data docker run \\ --name sqlserver2019 \\ -e \u0026#34;ACCEPT_EULA=Y\u0026#34; \\ -e \u0026#34;SA_PASSWORD=dev@123,\u0026#34; \\ -e \u0026#39;MSSQL_PID=HMWJ3-KY3J2-NMVD7-KG4JR-X2G8G\u0026#39; \\ -p 1433:1433 \\ -v /data/sqlserver2019_data:/var/opt/mssql \\ -d mcr.microsoft.com/mssql/server:2019-latest SQL Server 2019密钥 Enterprise：HMWJ3-KY3J2-NMVD7-KG4JR-X2G8G Strandard：PMBDC-FXVM3-T777P-N4FY8-PKFF4 #启用代理 --e MSSQL_AGENT_ENABLED=True docker run \\ --name sqlserver2019 \\ -e \u0026#34;ACCEPT_EULA=Y\u0026#34; \\ -e \u0026#34;SA_PASSWORD=To1m@kluas\u0026amp;123\u0026#34; \\ -e \u0026#39;MSSQL_PID=HMWJ3-KY3J2-NMVD7-KG4JR-X2G8G\u0026#39; \\ -e \u0026#39;MSSQL_AGENT_ENABLED=True\u0026#39; \\ -p 1433:1433 \\ -v /data/sqlserver2019_data:/var/opt/mssql \\ -d mcr.microsoft.com/mssql/server:2019-latest 注：sa的密码要设置成强密码，8位以上，不然容器会报错起不来 InfluxDB2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 --network my_network --ip 172.25.1.12 自动升级过程引导系统中的初始管理员用户、组织和存储桶。 其他环境变量用于配置设置逻辑： DOCKER_INFLUXDB_INIT_USERNAME：为系统的初始超级用户设置的用户名（ 必需 ）。 DOCKER_INFLUXDB_INIT_PASSWORD：为系统初始超级用户设置的密码（ 必填 ）。 DOCKER_INFLUXDB_INIT_ORG：为系统的初始组织设置的名称（ 必需 ）。 DOCKER_INFLUXDB_INIT_BUCKET：为系统的初始存储桶设置的名称（ 必需 ）。 DOCKER_INFLUXDB_INIT_RETENTION：系统的初始存储桶应保留数据的持续时间。 如果未设置，初始存储桶将永久保留数据。 DOCKER_INFLUXDB_INIT_ADMIN_TOKEN：与系统的初始超级用户关联的身份验证令牌。 如果未设置，系统将自动生成令牌。 #使用以下命令在主机文件系统上生成默认配置文件： docker run \\ --rm influxdb:2.3.0 \\ influxd print-config \u0026gt; config.yml docker run \\ --name influxdb2 \\ -d \\ -p 8086:8086 \\ --volume /data/influx2/data:/var/lib/influxdb2 \\ -v /data/influx2/config.yml:/etc/influxdb2/config.yml \\ influxdb:2.3.0 docker run \\ --name influxdb2 \\ -p 8086:8086 \\ -d \\ -v /data/influx2/data:/var/lib/influxdb2 \\ -v /data/influx2/config.yml:/etc/influxdb2/config.yml \\ --network my_network --ip 172.25.1.12 \\ influxdb:2.3.0 redis 1 2 3 4 5 6 7 8 9 10 11 docker run -d --name redis -p 6379:6379 redis docker run -d --name redis --network my_network --ip 172.25.1.11 redis #设置密码 docker run -d --name redis -p 6379:6379 redis --requirepass \u0026#34;QkKpDbHgqD@R5@aes5s3\u0026#34; #有多种不同的持久性策略可供选择。 如果至少执行了 1 次写入操作，此操作将每 60 秒保存一次数据库快照（这也会导致更多日志，因此 `loglevel`选项可能是可取的）。 如果启用持久性，数据将存储在 `VOLUME /data`，`-v /docker/host/dir:/data`（ docker run --name some-redis -d redis redis-server --save 60 1 --loglevel warning mysql 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 #方法一 #官方MySQL(5.7.19)的docker镜像在创建时映射的配置文件目录有所不同，MySQL(5.7.19)的默认配置文件是 /etc/mysql/my.cnf 文件。如果想要自定义配置，建议向 /etc/mysql/conf.d 目录中创建 .cnf 文件。新建的文件可以任意起名，只要保证后缀名是 cnf 即可。新建的文件中的配置项可以覆盖 /etc/mysql/my.cnf 中的配置项。 mkdir -p /data/mysql/data /data/mysql/logs /data/mysql/conf cat \u0026gt; /data/mysql/conf/my.cnf \u0026lt;\u0026lt;EOF [mysqld] #skip-name-resolve port = 3306 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci skip-character-set-client-handshake=1 default-storage-engine=INNODB max_allowed_packet = 500M explicit_defaults_for_timestamp=1 long_query_time = 10 lower_case_table_names=1 EOF #创建 docker run -p 3306:3306 --name mysql \\ -v /data/mysql/conf:/etc/mysql/conf.d \\ -v /data/mysql/logs:/logs \\ -v /data/mysql/data:/var/lib/mysql \\ -e MYSQL_ROOT_PASSWORD=123456 \\ --network my_network \\ --ip 172.25.1.10 \\ --name mysql5.7 \\ -d mysql:5.7 #无端口 docker run \\ --name mysql \\ -v /data/mysql/conf:/etc/mysql/conf.d \\ -v /data/mysql/logs:/logs \\ -v /data/mysql/data:/var/lib/mysql \\ -e MYSQL_ROOT_PASSWORD=amAM^EYz2av945Crw%N! \\ --network my_network \\ --ip 172.25.1.10 \\ --name mysql5.7 \\ -d mysql:5.7 #在/data/mysql/conf中创建 *.cnf 文件(叫什么都行) docker run --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 #方法二 docker run -d -e MYSQL_ROOT_PASSWORD=root --name mysql5.7 mysql:5.7 #复制配置 docker cp mysql5.7:/etc/mysql /data/mysql/conf #删除容器 docker rm -f mysql5.7 #建立容器 docker run -p 3306:3306 --name mysql-master \\ -v /data/mysql/log:/var/log/mysql \\ -v /data/mysql/data:/var/lib/mysql \\ -v /data/mysql/conf:/etc/mysql \\ -e MYSQL_ROOT_PASSWORD=123456 \\ -d mysql:5.7 #忽略大小写 修改/etc/my.cnf文件，在文件末尾加lower_case_table_names=1。 [mysqld] lower_case_table_names=1 重启mysql #my.cnf 基础配置 [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4 [mysqld] init_connect=\u0026#39;SET collation_connection = utf8_unicode_ci\u0026#39; init_connect=\u0026#39;SET NAMES utf8\u0026#39; character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake skip-name-resolve # 中文乱码问题 mysql5.7以上 [mysqld] character-set-server=utf8 [client] default-character-set=utf8 [mysql] default-character-set=utf8 docker run -p 33066:3306 --name mysql -v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/logs:/logs -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --network my_network --ip 172.25.1.10 -d mysql:5.7 --network my_network --ip 172.25.1.10 #mysql 8 版本 #启动 docker run --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=qweQWE123! -d mysql #进入容器 docker exec -it mysql bash #登录mysql mysql -u root -p ALTER USER \u0026#39;root\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026#39;qweQWE123!\u0026#39;; #添加远程登录用户 CREATE USER \u0026#39;liaozesong\u0026#39;@\u0026#39;%\u0026#39; IDENTIFIED WITH mysql_native_password BY \u0026#39;qweQWE123!\u0026#39;; GRANT ALL PRIVILEGES ON *.* TO \u0026#39;liaozesong\u0026#39;@\u0026#39;%\u0026#39;; tdengine 1 docker run -d --hostname=debian -v /etc/taos:/etc/taos -p 6030:6030 -p 6035:6035 -p 6041:6041 -p 6030-6040:6030-6040/udp tdengine/tdengine:2.0.14.0 Docker/Docker-Compose 安装 Kafka 1 2 3 4 5 6 7 8 9 10 11 docker run -d --name zookeeper -p 2181:2181 -e TZ=\u0026#34;Asia/Shanghai\u0026#34; -v /opt/zookeeper/data:/data --restart always zookeeper:3.7 docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=Zookeeper-IP:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://IP:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e TZ=\u0026#34;Asia/Shanghai\u0026#34; wurstmeister/kafka # 启动环境变量参数说明 KAFKA_BROKER_ID kafka集群中每个kafka都有一个BROKER_ID来区分自己 KAFKA_ADVERTISED_LISTENERS kafka的地址和端口，用于向zookeeper注册 KAFKA_ZOOKEEPER_CONNECTzookeeper 地址 KAFKA_LISTENERSkafka 监听端口TZ容器时区 docker run -d --name kfk-manager --restart always -p 9000:9000 -e ZK_HOSTS=\u0026lt;这里换成你的zookeeper地址和端口\u0026gt; sheepkiller/kafka-manager docker-compose.yml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 version: \u0026#39;3.5\u0026#39; services: zookeeper: image: wurstmeister/zookeeper ## 镜像 container_name: zookeeper ports: - \u0026#34;2181:2181\u0026#34; ## 对外暴露的端口号 kafka: image: wurstmeister/kafka ## 镜像 container_name: kafka volumes: - /etc/localtime:/etc/localtime ## 挂载位置（kafka镜像和宿主机器之间时间保持一直） ports: - \u0026#34;9092:9092\u0026#34; environment: KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1 ## 修改:宿主机IP KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 ## 卡夫卡运行是基于zookeeper的 KAFKA_ADVERTISED_PORT: 9092 KAFKA_LOG_RETENTION_HOURS: 120 KAFKA_MESSAGE_MAX_BYTES: 10000000 KAFKA_REPLICA_FETCH_MAX_BYTES: 10000000 KAFKA_GROUP_MAX_SESSION_TIMEOUT_MS: 60000 KAFKA_NUM_PARTITIONS: 3 KAFKA_DELETE_RETENTION_MS: 1000 kafka-map : image: dushixiang/kafka-map ## 镜像：开源的web管理kafka集群的界面 container_name: kafka-map environment: DEFAULT_USERNAME: admin DEFAULT_PASSWORD: admin ## 修改:宿主机IP ports: - \u0026#34;9009:8080\u0026#34; ## 暴露端口 9000这个端口冲突太多 volumes: - ../kafka-map/data:/usr/local/kafka-map/data kafka-manager: image: sheepkiller/kafka-manager ## 镜像：开源的web管理kafka集群的界面 container_name: kafka-manager environment: ZK_HOSTS: 192.168.110.30 ## 修改:宿主机IP ports: - \u0026#34;9009:9000\u0026#34; ## 暴露端口 9000这个端口冲突太多 hbase 1 docker run -d -p 2182:2181 -p 18080:8080 -p 8085:8085 -p 9090:9090 -p 9095:9095 -p 16000:16000 -p 16010:16010 -p 16201:16201 -p 16301:16301 -p 16030:16030 -p 16020:16020 --name hbase001 harisekhon/hbase clickhouse 1 2 3 4 docker run -d -p 18123:8123 -p19000:9000 --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server #测试 echo \u0026#39;SELECT version()\u0026#39; | curl \u0026#39;http://localhost:18123/\u0026#39; --data-binary @- 本机客户端连接 1 docker exec -it some-clickhouse-server clickhouse-client Elasticsearch8 需要 kibana.yml、elasticsearch.yml 文件放在对应目录\nelasticsearch.yml\n1 2 3 4 5 6 mkdir -p /data/elasticsearch/config/ vi /data/elasticsearch/config/elasticsearch.yml chown -R 10001:0 /data/elasticsearch/config/elasticsearch.yml # data 数据目录需要权限 chmod 777 -R /data/elasticsearch/ 1 2 3 cluster.name: \u0026#34;docker-cluster\u0026#34; network.host: 0.0.0.0 path.repo: [\u0026#34;/data/elasticsearch/backup\u0026#34;] kibana.yml\n1 2 mkdir -p /data/kibana/config/ vi /data/kibana/config/kibana.yml 1 2 3 4 5 6 7 8 9 10 # # ** THIS IS AN AUTO-GENERATED FILE ** # # Default Kibana configuration for docker target server.name: kibana server.host: \u0026#34;0\u0026#34; elasticsearch.hosts: [ \u0026#34;http://elasticsearch:9200\u0026#34; ] monitoring.ui.container.elasticsearch.enabled: true i18n.locale: \u0026#34;zh-CN\u0026#34; 1 vi docker-compose.yml ``\n创建.env 密码必须是字母数字，并且不能包含特殊字符 字符如 !或者 @。 这 bash脚本包含在 docker-compose.yml文件仅对字母数字字符进行操作。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 # \u0026#39;elastic\u0026#39; 用户的密码（至少6个字符） ELASTIC_PASSWORD=aa123456 # \u0026#39;kibana_system\u0026#39; 用户的密码（至少6个字符） KIBANA_PASSWORD=aa123456 # Elastic 产品的版本 STACK_VERSION=8.8.2 # 设置集群名称 CLUSTER_NAME=docker-cluster # 设置为 \u0026#39;basic\u0026#39; 或 \u0026#39;trial\u0026#39;，以自动启动为期30天的试用版 LICENSE=basic #LICENSE=trial # 将 Elasticsearch HTTP API 的端口暴露给主机 ES_PORT=9200 #ES_PORT=127.0.0.1:9200 # 将 Kibana 暴露给主机的端口 KIBANA_PORT=5601 #KIBANA_PORT=80 # 根据可用主机内存的情况进行增减（以字节为单位）,这里有个坑，因该直接设置值，不然会直接G掉 MEM_LIMIT=6g MEM_LIMIT=1073741824 # 项目命名空间（如果未设置，则默认为当前文件夹名称） #COMPOSE_PROJECT_NAME=myproject 集群版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 version: \u0026#34;2.2\u0026#34; services: setup: image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs user: \u0026#34;0\u0026#34; command: \u0026gt; bash -c \u0026#39; if [ x${ELASTIC_PASSWORD} == x ]; then echo \u0026#34;Set the ELASTIC_PASSWORD environment variable in the .env file\u0026#34;; exit 1; elif [ x${KIBANA_PASSWORD} == x ]; then echo \u0026#34;Set the KIBANA_PASSWORD environment variable in the .env file\u0026#34;; exit 1; fi; if [ ! -f config/certs/ca.zip ]; then echo \u0026#34;Creating CA\u0026#34;; bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip; unzip config/certs/ca.zip -d config/certs; fi; if [ ! -f config/certs/certs.zip ]; then echo \u0026#34;Creating certs\u0026#34;; echo -ne \\ \u0026#34;instances:\\n\u0026#34;\\ \u0026#34; - name: es01\\n\u0026#34;\\ \u0026#34; dns:\\n\u0026#34;\\ \u0026#34; - es01\\n\u0026#34;\\ \u0026#34; - localhost\\n\u0026#34;\\ \u0026#34; ip:\\n\u0026#34;\\ \u0026#34; - 127.0.0.1\\n\u0026#34;\\ \u0026#34; - name: es02\\n\u0026#34;\\ \u0026#34; dns:\\n\u0026#34;\\ \u0026#34; - es02\\n\u0026#34;\\ \u0026#34; - localhost\\n\u0026#34;\\ \u0026#34; ip:\\n\u0026#34;\\ \u0026#34; - 127.0.0.1\\n\u0026#34;\\ \u0026#34; - name: es03\\n\u0026#34;\\ \u0026#34; dns:\\n\u0026#34;\\ \u0026#34; - es03\\n\u0026#34;\\ \u0026#34; - localhost\\n\u0026#34;\\ \u0026#34; ip:\\n\u0026#34;\\ \u0026#34; - 127.0.0.1\\n\u0026#34;\\ \u0026gt; config/certs/instances.yml; bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key; unzip config/certs/certs.zip -d config/certs; fi; echo \u0026#34;Setting file permissions\u0026#34; chown -R root:root config/certs; find . -type d -exec chmod 750 \\{\\} \\;; find . -type f -exec chmod 640 \\{\\} \\;; echo \u0026#34;Waiting for Elasticsearch availability\u0026#34;; until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q \u0026#34;missing authentication credentials\u0026#34;; do sleep 30; done; echo \u0026#34;Setting kibana_system password\u0026#34;; until curl -s -X POST --cacert config/certs/ca/ca.crt -u \u0026#34;elastic:${ELASTIC_PASSWORD}\u0026#34; -H \u0026#34;Content-Type: application/json\u0026#34; https://es01:9200/_security/user/kibana_system/_password -d \u0026#34;{\\\u0026#34;password\\\u0026#34;:\\\u0026#34;${KIBANA_PASSWORD}\\\u0026#34;}\u0026#34; | grep -q \u0026#34;^{}\u0026#34;; do sleep 10; done; echo \u0026#34;All done!\u0026#34;; \u0026#39; healthcheck: test: [\u0026#34;CMD-SHELL\u0026#34;, \u0026#34;[ -f config/certs/es01/es01.crt ]\u0026#34;] interval: 1s timeout: 5s retries: 120 es01: depends_on: setup: condition: service_healthy image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs - esdata01:/usr/share/elasticsearch/data ports: - ${ES_PORT}:9200 environment: - node.name=es01 - cluster.name=${CLUSTER_NAME} - cluster.initial_master_nodes=es01,es02,es03 - discovery.seed_hosts=es02,es03 - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=certs/es01/es01.key - xpack.security.http.ssl.certificate=certs/es01/es01.crt - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.key=certs/es01/es01.key - xpack.security.transport.ssl.certificate=certs/es01/es01.crt - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.verification_mode=certificate - xpack.license.self_generated.type=${LICENSE} mem_limit: ${MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 healthcheck: test: [ \u0026#34;CMD-SHELL\u0026#34;, \u0026#34;curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q \u0026#39;missing authentication credentials\u0026#39;\u0026#34;, ] interval: 10s timeout: 10s retries: 120 es02: depends_on: - es01 image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs - esdata02:/usr/share/elasticsearch/data environment: - node.name=es02 - cluster.name=${CLUSTER_NAME} - cluster.initial_master_nodes=es01,es02,es03 - discovery.seed_hosts=es01,es03 - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=certs/es02/es02.key - xpack.security.http.ssl.certificate=certs/es02/es02.crt - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.key=certs/es02/es02.key - xpack.security.transport.ssl.certificate=certs/es02/es02.crt - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.verification_mode=certificate - xpack.license.self_generated.type=${LICENSE} mem_limit: ${MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 healthcheck: test: [ \u0026#34;CMD-SHELL\u0026#34;, \u0026#34;curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q \u0026#39;missing authentication credentials\u0026#39;\u0026#34;, ] interval: 10s timeout: 10s retries: 120 es03: depends_on: - es02 image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs - esdata03:/usr/share/elasticsearch/data environment: - node.name=es03 - cluster.name=${CLUSTER_NAME} - cluster.initial_master_nodes=es01,es02,es03 - discovery.seed_hosts=es01,es02 - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=certs/es03/es03.key - xpack.security.http.ssl.certificate=certs/es03/es03.crt - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.key=certs/es03/es03.key - xpack.security.transport.ssl.certificate=certs/es03/es03.crt - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.verification_mode=certificate - xpack.license.self_generated.type=${LICENSE} mem_limit: ${MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 healthcheck: test: [ \u0026#34;CMD-SHELL\u0026#34;, \u0026#34;curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q \u0026#39;missing authentication credentials\u0026#39;\u0026#34;, ] interval: 10s timeout: 10s retries: 120 kibana: depends_on: es01: condition: service_healthy es02: condition: service_healthy es03: condition: service_healthy image: docker.elastic.co/kibana/kibana:${STACK_VERSION} volumes: - certs:/usr/share/kibana/config/certs - kibanadata:/usr/share/kibana/data ports: - ${KIBANA_PORT}:5601 environment: - SERVERNAME=kibana - ELASTICSEARCH_HOSTS=https://es01:9200 - ELASTICSEARCH_USERNAME=kibana_system - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD} - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt mem_limit: ${MEM_LIMIT} healthcheck: test: [ \u0026#34;CMD-SHELL\u0026#34;, \u0026#34;curl -s -I http://localhost:5601 | grep -q \u0026#39;HTTP/1.1 302 Found\u0026#39;\u0026#34;, ] interval: 10s timeout: 10s retries: 120 volumes: certs: driver: local esdata01: driver: local esdata02: driver: local esdata03: driver: local kibanadata: driver: local networks: es-test: driver: bridge 单机版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 version: \u0026#34;2.2\u0026#34; services: setup: image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs user: \u0026#34;0\u0026#34; command: \u0026gt; bash -c \u0026#39; if [ x${ELASTIC_PASSWORD} == x ]; then echo \u0026#34;Set the ELASTIC_PASSWORD environment variable in the .env file\u0026#34;; exit 1; elif [ x${KIBANA_PASSWORD} == x ]; then echo \u0026#34;Set the KIBANA_PASSWORD environment variable in the .env file\u0026#34;; exit 1; fi; if [ ! -f config/certs/ca.zip ]; then echo \u0026#34;Creating CA\u0026#34;; bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip; unzip config/certs/ca.zip -d config/certs; fi; if [ ! -f config/certs/certs.zip ]; then echo \u0026#34;Creating certs\u0026#34;; echo -ne \\ \u0026#34;instances:\\n\u0026#34;\\ \u0026#34; - name: es01\\n\u0026#34;\\ \u0026#34; dns:\\n\u0026#34;\\ \u0026#34; - es01\\n\u0026#34;\\ \u0026#34; - localhost\\n\u0026#34;\\ \u0026#34; ip:\\n\u0026#34;\\ \u0026#34; - 127.0.0.1\\n\u0026#34;\\ \u0026#34; - name: es02\\n\u0026#34;\\ \u0026#34; dns:\\n\u0026#34;\\ \u0026#34; - es02\\n\u0026#34;\\ \u0026#34; - localhost\\n\u0026#34;\\ \u0026#34; ip:\\n\u0026#34;\\ \u0026#34; - 127.0.0.1\\n\u0026#34;\\ \u0026#34; - name: es03\\n\u0026#34;\\ \u0026#34; dns:\\n\u0026#34;\\ \u0026#34; - es03\\n\u0026#34;\\ \u0026#34; - localhost\\n\u0026#34;\\ \u0026#34; ip:\\n\u0026#34;\\ \u0026#34; - 127.0.0.1\\n\u0026#34;\\ \u0026gt; config/certs/instances.yml; bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key; unzip config/certs/certs.zip -d config/certs; fi; echo \u0026#34;Setting file permissions\u0026#34; chown -R root:root config/certs; find . -type d -exec chmod 750 \\{\\} \\;; find . -type f -exec chmod 640 \\{\\} \\;; echo \u0026#34;Waiting for Elasticsearch availability\u0026#34;; until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q \u0026#34;missing authentication credentials\u0026#34;; do sleep 30; done; echo \u0026#34;Setting kibana_system password\u0026#34;; until curl -s -X POST --cacert config/certs/ca/ca.crt -u \u0026#34;elastic:${ELASTIC_PASSWORD}\u0026#34; -H \u0026#34;Content-Type: application/json\u0026#34; https://es01:9200/_security/user/kibana_system/_password -d \u0026#34;{\\\u0026#34;password\\\u0026#34;:\\\u0026#34;${KIBANA_PASSWORD}\\\u0026#34;}\u0026#34; | grep -q \u0026#34;^{}\u0026#34;; do sleep 10; done; echo \u0026#34;All done!\u0026#34;; \u0026#39; healthcheck: test: [\u0026#34;CMD-SHELL\u0026#34;, \u0026#34;[ -f config/certs/es01/es01.crt ]\u0026#34;] interval: 1s timeout: 5s retries: 120 es01: depends_on: setup: condition: service_healthy image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs - esdata01:/usr/share/elasticsearch/data ports: - ${ES_PORT}:9200 environment: - node.name=es01 - cluster.name=${CLUSTER_NAME} - cluster.initial_master_nodes=es01 - discovery.seed_hosts=es02,es03 - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=certs/es01/es01.key - xpack.security.http.ssl.certificate=certs/es01/es01.crt - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.key=certs/es01/es01.key - xpack.security.transport.ssl.certificate=certs/es01/es01.crt - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.verification_mode=certificate - xpack.license.self_generated.type=${LICENSE} mem_limit: ${MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 healthcheck: test: [ \u0026#34;CMD-SHELL\u0026#34;, \u0026#34;curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q \u0026#39;missing authentication credentials\u0026#39;\u0026#34;, ] interval: 10s timeout: 10s retries: 120 kibana: depends_on: es01: condition: service_healthy image: docker.elastic.co/kibana/kibana:${STACK_VERSION} volumes: - certs:/usr/share/kibana/config/certs - kibanadata:/usr/share/kibana/data ports: - ${KIBANA_PORT}:5601 environment: - SERVERNAME=kibana - ELASTICSEARCH_HOSTS=https://es01:9200 - ELASTICSEARCH_USERNAME=kibana_system - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD} - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt mem_limit: ${MEM_LIMIT} healthcheck: test: [ \u0026#34;CMD-SHELL\u0026#34;, \u0026#34;curl -s -I http://localhost:5601 | grep -q \u0026#39;HTTP/1.1 302 Found\u0026#39;\u0026#34;, ] interval: 10s timeout: 10s retries: 120 volumes: certs: driver: local esdata01: driver: local kibanadata: driver: local networks: es-test: driver: bridge kibana改为中文 只需要修改kibana配置文件，添加一行：i18n.locale: \u0026ldquo;zh-CN\u0026rdquo;，即可\nkibana默认安装配置文件路径：/usr/share/kibana/config/kibana.yml\n1 2 3 4 5 #docker exec -it es-8x-kibana-1 /bin/bash docker cp es-8x-kibana-1:/usr/share/kibana/config/kibana.yml kibana.yml docker cp kibana.yml es-8x-kibana-1:/usr/share/kibana/config/kibana.yml docker restart es-8x-kibana-1 debezium 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #官方命令 docker run -it -d --name connect \\ -p 8083:8083 \\ -e GROUP_ID=1 \\ -e CONFIG_STORAGE_TOPIC=my-connect-configs \\ -e OFFSET_STORAGE_TOPIC=my-connect-offsets \\ -e ADVERTISED_HOST_NAME=$(echo $DOCKER_HOST | cut -f3 -d \u0026#39;/\u0026#39; | cut -f1 -d\u0026#39;:\u0026#39;) \\ --link zookeeper:zookeeper \\ --link kafka:kafka \\ debezium/connect # 不参与链接 docker run -it -d --name connect \\ -p 8183:8083 \\ -e GROUP_ID=1 \\ -e CONFIG_STORAGE_TOPIC=my-connect-configs \\ -e OFFSET_STORAGE_TOPIC=my-connect-offsets \\ -e ADVERTISED_HOST_NAME=$(echo $DOCKER_HOST | cut -f3 -d \u0026#39;/\u0026#39; | cut -f1 -d\u0026#39;:\u0026#39;) \\ -e BOOTSTRAP_SERVERS=192.168.110.30:9094 \\ debezium/connect:2.4 docker run -it -d --name connect \\ -p 8183:8083 \\ -e GROUP_ID=1 \\ -e CONFIG_STORAGE_TOPIC=my-connect-configs \\ -e OFFSET_STORAGE_TOPIC=my-connect-offsets \\ -e ADVERTISED_HOST_NAME=$(echo $DOCKER_HOST | cut -f3 -d \u0026#39;/\u0026#39; | cut -f1 -d\u0026#39;:\u0026#39;) \\ debezium/connect flink 单机版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 version: \u0026#34;2.2\u0026#34; services: jobmanager: image: flink:1.17-java8 ports: - \u0026#34;8081:8081\u0026#34; command: jobmanager environment: - | FLINK_PROPERTIES= jobmanager.rpc.address: jobmanager TZ: Asia/Shanghai taskmanager: image: flink:1.17-java8 depends_on: - jobmanager command: taskmanager scale: 1 environment: - | FLINK_PROPERTIES= jobmanager.rpc.address: jobmanager taskmanager.numberOfTaskSlots: 2 TZ: Asia/Shanghai 持久化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 version: \u0026#34;2.2\u0026#34; services: jobmanager: image: flink:1.17-java8 ports: - \u0026#34;8081:8081\u0026#34; command: jobmanager restart: always environment: FLINK_PROPERTIES: | jobmanager.rpc.address: jobmanager TZ: Asia/Shanghai volumes: - jobmanager_data:/opt/flink/data taskmanager: image: flink:1.17-java8 depends_on: - jobmanager command: taskmanager restart: always scale: 1 environment: FLINK_PROPERTIES: | jobmanager.rpc.address: jobmanager taskmanager.numberOfTaskSlots: 2 TZ: Asia/Shanghai volumes: - taskmanager_data:/opt/flink/data volumes: jobmanager_data: taskmanager_data: kafka-单机版 bitnami版本 1 chown -R 1001:1001 /data/kafka-persistence 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 version: \u0026#34;3\u0026#34; services: kafka: image: \u0026#39;bitnami/kafka:latest\u0026#39; restart: always ports: - \u0026#39;9093:9092\u0026#39; - \u0026#39;9094:9094\u0026#39; environment: - KAFKA_CFG_NODE_ID=0 - KAFKA_CFG_PROCESS_ROLES=controller,broker - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093 - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://xxxxxxxxxxxxxxx:9094 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT - TZ=Asia/Shanghai volumes: - /data/kafka-persistence:/bitnami/kafka kafka-map : image: dushixiang/kafka-map ## 镜像：开源的web管理kafka集群的界面 container_name: kafka-map restart: always environment: DEFAULT_USERNAME: admin DEFAULT_PASSWORD: CeF4f332PfSQPvjQfy ## 修改:宿主机IP ports: - \u0026#34;9011:8080\u0026#34; ## 暴露端口 9000这个端口冲突太多 volumes: - ../kafka-map/data:/usr/local/kafka-map/data MQTT（emqx） 默认账户密码: admin public\n1 m.daocloud.io/docker.io/emqx:latest 1 2 3 4 5 6 7 8 9 10 11 12 13 14 docker run -d --name emqx -p 18083:18083 -p 1883:1883 emqx:latest docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 m.daocloud.io/docker.io/emqx:latest #路径映射(无配置文件) docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 -v $PWD/emqx/data:/opt/emqx/data -v $PWD/emqx/log:/opt/emqx/log m.daocloud.io/emqx/emqx:latest #配置文件复制 docker cp emqx:/opt/emqx/etc/emqx.conf $PWD/emqx/config/emqx.conf #包含配置文件 docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 -v $PWD/emqx/data:/opt/emqx/data -v $PWD/emqx/log:/opt/emqx/log -v $PWD/emqx/config/emqx.conf:/opt/emqx/etc/emqx.conf m.daocloud.io/emqx/emqx:latest docker-compose 1 2 3 4 5 6 7 8 9 10 11 12 13 14 version: \u0026#39;3\u0026#39; services: emqx: image: emqx:latest restart: always environment: EMQX_NODE__NAME: foo_emqx@172.16.0.169 volumes: - vol-emqx-data:/opt/emqx/data - vol-emqx-log:/opt/emqx/log ports: - \u0026#34;1883:1883\u0026#34; - \u0026#34;8083:8083\u0026#34; - \u0026#34;18083:18083\u0026#34; 1 docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.8.1 ","permalink":"https://blog.curlc.com/posts/docker-dev-images/","summary":"\u003cp\u003e开发过程中常用镜像。\u003c/p\u003e","title":"Docker-开发相关镜像"},{"content":"生产环境对于文件服务，尤其是对外提供访问的场景，需要注意以下几点，以防止伪装文件被解析执行等安全风险，从而被黑产利用上传恶意文件，如上传 html 作为钓鱼、菠菜、跳转 进行传播，利用你的域名当作跳板，导致域名封、通报、用户上当受骗等问题。\nNginx 访问限制与安全加固方案 一、限制非图片文件访问 仅允许访问指定图片格式，如有其他格式也是类似新增。\n目的:防止伪装文件被解析执行。但这种方式无法完全杜绝风险，需要结合其他手段。\n1 2 3 if ($uri !~* \\.(jpg|jpeg|png|gif)$) { return 403; } 二、结合 Referer 进行访问限制 通过校验 Referer 来源域名，同时限制文件类型：\n1 2 3 4 5 6 7 8 9 10 11 location /uploads/ { # 校验 Referer 是否来自允许的域名 if ($http_referer !~* \u0026#34;^https://your-mini-program-domain\\.com\u0026#34;) { return 403; } # 限制非图片文件访问 if ($uri !~* \\.(jpg|jpeg|png|gif)$) { return 403; } } 三、结合 Token 验证(后端代理文件请求方式) 仅允许携带合法 Token 的请求访问资源，适用于私有资源或鉴权场景。\n可参考文章：基于S3协议对外分享文件权限管理方案-后端代理文件请求。\n四、文件访问签名验证(S3方式) 通过签名 URL（Pre-Signed URL）控制访问权限，仅允许在有效期内通过合法签名访问文件。\n可参考文章：基于S3协议对外分享文件权限管理方案-基于预签名-url。\n五、临时凭证（STS）与策略控制(S3方式) 使用 STS 动态下发临时凭证，通过策略实现细粒度、时效性的权限分配。\n可参考文章：基于S3协议对外分享文件权限管理方案-基于临时凭证sts。\n六、上传接口安全过滤 从上传入口进行多重校验，降低伪装文件风险：\n文件扩展名过滤\nMIME 类型校验\n图片内容校验（如 ImageIO 读取）\n读取文件前几个字节，判断是否符合常见图片格式特征(如 魔术字节)\n七、基于用户权限开放接口 从接口层面进行权限控制，不同用户仅允许访问授权资源。\n八、记录上传者信息 保留上传用户、时间、IP 等审计信息，便于追溯和风控。\n九、屏蔽国外 IP 通过 Nginx、WAF 或防火墙策略限制特定国家或地区 IP 的访问。\n十、响应内容增加安全头 即使文件被伪装访问，通过严格的安全响应头降低被解析和执行的风险。\n常用安全头配置 Content-Security-Policy：限制资源加载和脚本执行\n1 add_header Content-Security-Policy \u0026#34;default-src \u0026#39;none\u0026#39;;\u0026#34;; X-Content-Type-Options：禁止浏览器进行 MIME 类型嗅探\n1 add_header X-Content-Type-Options \u0026#34;nosniff\u0026#34;; X-Frame-Options：防止内容被嵌入 iframe\n1 add_header X-Frame-Options \u0026#34;DENY\u0026#34;; 十一、整体防护策略总结 为全面防止伪装文件被解析，可从多个阶段进行控制：\n上传阶段：校验真实文件类型和内容\n存储阶段：限制敏感文件的存储路径与公开访问\n响应阶段：增加安全头部和浏览器策略限制\n十二、Nginx 拦截 Spring Boot Actuator 直接在 Nginx 层拦截敏感端点：\n1 2 3 location /api/actuator { return 403; } 十三、关闭或限制 API 文档、Swagger、Actuator 通过配置彻底禁用 Actuator HTTP 访问端口：\n1 2 3 4 5 6 7 8 9 10 11 12 13 --- # Actuator 监控端点配置 management: endpoints: web: exposure: include: \u0026#39;*\u0026#39; endpoint: health: show-details: ALWAYS logfile: external-file: ./logs/sys-console.log server: port: -1 # 设置为 -1，禁用 Actuator HTTP 端口 S3协议，拦截“Response Header Overrides（响应头覆盖）”查询参数 用户可以通过 URL 参数 强制让 S3 在返回对象时使用指定的 Content-Type，从而把原本当作图片/二进制的对象 当成 HTML 返回并被浏览器解析。 如:\n参数 作用 response-content-type 覆盖 Content-Type response-content-disposition 控制 inline / attachment response-content-language 覆盖语言 response-cache-control 覆盖缓存策略 response-content-encoding 覆盖编码 response-expires 覆盖过期时间 常见攻击/绕过组合：\n1 2 ?response-content-type=text/html \u0026amp;response-content-disposition=inline 可通过 Nginx 层拦截这些参数：\n1 2 3 4 5 6 7 # Block S3 response override if ($query_string ~* \u0026#34;(^|\u0026amp;)response-(content-type|content-disposition|content-encoding|content-language|cache-control|expires)=\u0026#34;) { return 403; } # 禁止浏览器进行 MIME sniffing（类型嗅探） add_header X-Content-Type-Options nosniff always; ","permalink":"https://blog.curlc.com/posts/file-service-production-notes/","summary":"\u003cp\u003e生产环境对于文件服务，尤其是对外提供访问的场景，需要注意以下几点，以防止伪装文件被解析执行等安全风险，从而被黑产利用上传恶意文件，如上传 html 作为钓鱼、菠菜、跳转 进行传播，利用你的域名当作跳板，导致域名封、通报、用户上当受骗等问题。\u003c/p\u003e","title":"生产环境对于文件服务注意事项"},{"content":"创建数据和配置目录 1 2 mkdir -p /opt/minio/{data,config,init} cd /opt/minio 创建docker-compose.yml 注意: 此配置中 minio 的环境变量不能设置MINIO_SERVER_URL(文章末尾会有说明),除非服务器做了 FQDN，否则会出现webui页面登录不上的情况，即报错{\u0026quot;message\u0026quot;:\u0026quot;invalid Login\u0026quot;},但可配置MINIO_BROWSER_REDIRECT_URL做webui的重定向。\n以下的镜像是minio最后一个带web控制台的版本，如果需要最新版本请参考Minio官方文档。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 version: \u0026#34;3.8\u0026#34; services: minio: image: minio/minio:RELEASE.2025-04-22T22-12-26Z container_name: minio restart: unless-stopped # 对外端口：9000(S3 API) 9001(Console) ports: - \u0026#34;9000:9000\u0026#34; - \u0026#34;9001:9001\u0026#34; # 数据和配置持久化 volumes: - ./data:/data - ./config:/root/.minio # 生产建议：用 .env 管理账号密码 environment: # 管理员账号密码（必须设置；不建议用默认值） MINIO_ROOT_USER: ${MINIO_ROOT_USER} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD} # 可选：设置对外显示的访问地址 # 未做 FQDN 不要设置 # MINIO_DOMAIN=example.com # 服务器地址，未做 FQDN 不要设置 # MINIO_SERVER_URL=http://example.com # 控制台地址，仅设置 重定向 控制台地址 # MINIO_BROWSER_REDIRECT_URL: \u0026#34;https://console.example.com\u0026#34; # 启动命令 command: server /data --console-address \u0026#34;:9001\u0026#34; # 健康检查：MinIO 自带 health endpoint healthcheck: test: [\u0026#34;CMD\u0026#34;, \u0026#34;curl\u0026#34;, \u0026#34;-f\u0026#34;, \u0026#34;http://localhost:9000/minio/health/live\u0026#34;] interval: 10s timeout: 5s retries: 5 配置 .env 1 2 MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=Password_123! 启动 在 docker-compose.yml 所在目录运行：\n1 docker-compose up -d 题外话 （可选）自动初始化 创建 Bucket、创建普通用户、设置策略 可以把初始化脚本放在 init 目录，容器启动时会自动执行。 例如，创建一个 init/setup.sh：\n1 2 3 4 5 #!/bin/bash mc alias set local http://localhost:9000 $MINIO_ROOT_USER $MINIO_ROOT_PASSWORD mc mb local/my-bucket mc admin user add local myuser MyUserPassword123! mc admin policy set local readwrite user=myuser 然后在 docker-compose.yml 中添加挂载：\n1 2 3 4 volumes: - ./data:/data - ./config:/root/.minio - ./init:/docker-entrypoint-init.d 脚本会在 MinIO 启动后自动运行一次，完成初始化工作。\n（可选）Nginx 反向代理 注意: MinIO 控制台（默认端口 9001）和 S3 API（默认端口 9000）是两个不同的服务。 理论上 MinIO 控制台和 S3 API 可以共用一个域名，但在实际使用中可能会遇到 CORS 和签名验证问题，建议分别使用不同的子域名。 以下配置我将MinIO控制台放在了同一个域名下的web-ui，那么docker-compose中的MINIO_BROWSER_REDIRECT_URL也需要相应修改。 以下是共用一个域名的最小 Nginx 示例配置：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 location /web-ui/ { rewrite ^/web-ui/(.*) /$1 break; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-NginX-Proxy true; # This is necessary to pass the correct IP to be hashed real_ip_header X-Real-IP; proxy_connect_timeout 300; # To support websockets in MinIO versions released after January 2023 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; # Some environments may encounter CORS errors (Kubernetes + Nginx Ingress) # Uncomment the following line to set the Origin request to an empty string # proxy_set_header Origin \u0026#39;\u0026#39;; chunked_transfer_encoding off; proxy_pass http://localhost:9011; # This uses the upstream directive definition to load balance } # 为了防止直接访问 S3 API 根路径跳转到 web UI，单独处理根路径请求。 location = / { # return 404; return 200 \u0026#34;S3 endpoint\u0026#34;; add_header Content-Type text/plain; } location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 关键配置：禁用 HEAD 请求转换，避免 S3 V4 签名失效 proxy_cache_convert_head off; proxy_connect_timeout 300; proxy_http_version 1.1; proxy_set_header Connection \u0026#34;\u0026#34;; proxy_pass http://localhost:9010/; } (可选)单机多盘挂载 如果服务器有多块磁盘，可以通过绑定挂载的方式，把多块磁盘都挂载到 MinIO 容器中，例如：\n1 2 3 4 5 volumes: - /mnt/disk1:/data/disk1 - /mnt/disk2:/data/disk2 - /mnt/disk3:/data/disk3 - /mnt/disk4:/data/disk4 docker-compose 的 command 也需要相应修改：\n1 command: server /data/disk1 /data/disk2 /data/disk3 /data/disk4 --console-address \u0026#34;:9001\u0026#34; (可选)关于 MINIO_SERVER_URL 关于文章顶部提到的不设置 MINIO_SERVER_URL 环境变量的说明：\n不是“不能设置 MINIO_SERVER_URL”，而是一旦设置了 MINIO_SERVER_URL，MinIO Console 会把它当作“后端 Server 的对外可访问地址”去回连/校验；如果这个地址在 容器/宿主机网络视角 下不可达（典型就是：域名没解析、解析到外网、回环被阻断、TLS 不信任、走 CDN/WAF 导致回源不通），Console 登录就会失败，并且经常“误报”为 {\u0026ldquo;message\u0026rdquo;:\u0026ldquo;invalid login\u0026rdquo;}。\nMinIO Console 的登录流程并不只是“前端校验账号密码”，它还要跟 MinIO Server 通信完成认证/令牌流程；当 Console 连不上它认为的 Server 地址时，前端有些版本会统一返回 Invalid Login。参考\n什么情况下需要设置 MINIO_SERVER_URL？ 它主要服务于这些场景：\n多节点分布式 MinIO 每个节点有明确、稳定、对等可达的公网/内网 FQDN 没有反代、或反代对节点是“透明的” 例如:\n1 2 3 4 node1.minio.local node2.minio.local node3.minio.local node4.minio.local 这种环境里：\n节点互访靠 FQDN Console 不会走“绕一圈再回自己”的路径 它是给 MinIO 自己内部 用的（尤其是 Console） 在 Docker + 反代 + 单机场景下，不推荐显式设置 MINIO_SERVER_URL，因为它很容易破坏 Console 的自举假设。\nMINIO_SERVER_URL 不是“给客户端用的”，而是“给 MinIO Console 用的”，它告诉 Console 去哪里找后端 Server。\n实际上：\nS3 客户端 完全不读这个变量 SDK / 浏览器 / 下载链接 完全不依赖它 反代/Nginx 也不需要它 Console 会信任你写的这个地址\n并在登录、token、redirect、一些 API 拼接中使用它\n单机+Nginx设置了MINIO_SERVER_URL会怎么样？ Docker + 反代时，“对外地址 ≠ 容器可达地址” 这种情况下设置 MINIO_SERVER_URL 往往会导致 Console 连不上 Server，从而报错 Invalid Login。 现在的拓扑是：\n1 2 3 4 5 Browser ↓ https://example.com (443) Nginx (host) ↓ http://127.0.0.1:9010 MinIO Server (docker) 当设置：\n1 MINIO_SERVER_URL=https://example.com Console（在容器里）就会：\n1 2 3 4 Console (docker) ↓ https://example.com Nginx (host) ↓ 回到 MinIO 这里面任何一个点出问题（DNS、hairpin NAT、TLS、SNI、重写、location = /、子路径）,Console 就会 “连不上自己”。\n而 Console 的前端在这种情况下：\n1 2 不会告诉你“我连不上 Server” 而是统一报：invalid login 我就想设置 MINIO_SERVER_URL，怎么办？ 截至目前，我尝试了docker-compose里设置extra_hosts、单独给console设置域名，都没成功。如果有大佬知道更好的方法，欢迎交流。\n(废弃)在 docker-compose 里给 MinIO 容器加 hosts 映射 注意注意,\n1 2 3 4 services: minio: extra_hosts: - \u0026#34;example.com:10.0.0.4\u0026#34; # 改成你的宿主机内网IP 或者使用 host-gateway（Docker 20.10+ 支持）：\n1 2 3 4 5 services: minio: extra_hosts: - \u0026#34;host.docker.internal:host-gateway\u0026#34; - \u0026#34;example.com:host-gateway\u0026#34; ","permalink":"https://blog.curlc.com/posts/minio-docker-setup/","summary":"\u003ch2 id=\"创建数据和配置目录\"\u003e创建数据和配置目录\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir -p /opt/minio/\u003cspan class=\"o\"\u003e{\u003c/span\u003edata,config,init\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e /opt/minio\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"创建docker-composeyml\"\u003e创建docker-compose.yml\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e注意\u003c/strong\u003e: 此配置中 minio 的环境变量不能设置\u003ccode\u003eMINIO_SERVER_URL\u003c/code\u003e(文章末尾会有说明),除非服务器做了 FQDN，否则会出现webui页面登录不上的情况，即报错\u003ccode\u003e{\u0026quot;message\u0026quot;:\u0026quot;invalid Login\u0026quot;}\u003c/code\u003e,但可配置MINIO_BROWSER_REDIRECT_URL做webui的重定向。\u003c/p\u003e\n\u003cp\u003e以下的镜像是minio最后一个带web控制台的版本，如果需要最新版本请参考Minio官方文档。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;3.8\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eservices\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eminio\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eminio/minio:RELEASE.2025-04-22T22-12-26Z\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003econtainer_name\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eminio\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eunless-stopped\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# 对外端口：9000(S3 API) 9001(Console)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eports\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;9000:9000\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"s2\"\u003e\u0026#34;9001:9001\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# 数据和配置持久化\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evolumes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e./data:/data\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e./config:/root/.minio\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# 生产建议：用 .env 管理账号密码\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eenvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# 管理员账号密码（必须设置；不建议用默认值）\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eMINIO_ROOT_USER\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${MINIO_ROOT_USER}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eMINIO_ROOT_PASSWORD\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e${MINIO_ROOT_PASSWORD}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# 可选：设置对外显示的访问地址\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# 未做 FQDN 不要设置\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# MINIO_DOMAIN=example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# 服务器地址，未做 FQDN 不要设置\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# MINIO_SERVER_URL=http://example.com\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# 控制台地址，仅设置 重定向 控制台地址\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# MINIO_BROWSER_REDIRECT_URL: \u0026#34;https://console.example.com\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# 启动命令\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecommand\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eserver /data --console-address \u0026#34;:9001\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c\"\u003e# 健康检查：MinIO 自带 health endpoint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ehealthcheck\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etest\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;CMD\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;curl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;-f\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;http://localhost:9000/minio/health/live\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003einterval\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e10s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003etimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e5s\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eretries\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e5\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"配置-env\"\u003e配置 .env\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-env\" data-lang=\"env\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMINIO_ROOT_USER\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003eadmin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eMINIO_ROOT_PASSWORD\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ePassword_123!\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"启动\"\u003e启动\u003c/h2\u003e\n\u003cp\u003e在 docker-compose.yml 所在目录运行：\u003c/p\u003e","title":"Minio Docker 搭建"},{"content":"由于微软将续订程序的回调地址拉黑（会认为使用此回调地址的应用为钓鱼应用），从而将创建的 应用程序 禁用，导致应用无法进行授权。\n之前已经授权过的应用暂时不影响（在应用 access_token有效期内）,今天会临时加急更新一版，明天下午上线，临时解决这个问题。\n同时新版本预计年后上线。\n查看应用是否被禁用 ","permalink":"https://blog.curlc.com/archives/1042/","summary":"\u003cp\u003e由于微软将续订程序的回调地址拉黑（会认为使用此回调地址的应用为钓鱼应用），从而将创建的 应用程序 禁用，导致应用无法进行授权。\u003c/p\u003e\n\u003cp\u003e之前已经授权过的应用暂时不影响（在应用 access_token有效期内）,今天会临时加急更新一版，明天下午上线，临时解决这个问题。\u003c/p\u003e\n\u003cp\u003e同时新版本预计年后上线。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch1 id=\"查看应用是否被禁用\"\u003e查看应用是否被禁用\u003c/h1\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.328888.xyz/2023/01/14/w62ak.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.328888.xyz/2023/01/14/w6OkL.png\"\u003e\u003c/p\u003e","title":"关于续订程序出现授权出错问题"},{"content":"目前已经使用docker私有部署的为知快2年了，之前用过 onenote、印象笔记、有道笔记、notion、蚂蚁笔记等等，全部用过一段时间后还是选择了为知笔记，一是服务的在自己手里，数据配合脚本实时同步到OneDrive，二是目前重构版的客户端确实好用很多，不像之前要卡半天~\n看网上一直在吹这个notion，不得不说操作上确实很爽，但每次打开不嫌慢吗?\n下面是为知的docker搭建方式，其实官方写得很清楚了~\n1 2 3 4 5 6 7 8 docker run --name wiz \\ --restart=always \\ -it -d \\ -v ~/wizdata:/wiz/storage\\ -v /etc/localtime:/etc/localtime \\ -p 8080:80 \\ -p 9269:9269/udp \\ wiznote/wizserver nginx 反代 1 2 3 4 5 6 7 8 location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header x-wiz-real-ip $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://ip:8081; } ","permalink":"https://blog.curlc.com/archives/1004/","summary":"\u003cp\u003e目前已经使用docker私有部署的为知快2年了，之前用过 onenote、印象笔记、有道笔记、notion、蚂蚁笔记等等，全部用过一段时间后还是选择了为知笔记，一是服务的在自己手里，数据配合脚本实时同步到OneDrive，二是目前重构版的客户端确实好用很多，不像之前要卡半天~\u003c/p\u003e\n\u003cp\u003e看网上一直在吹这个notion，不得不说操作上确实很爽，但每次打开不嫌慢吗?\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e下面是为知的docker搭建方式，其实\u003ca href=\"https://www.wiz.cn/zh-cn/docker.html\"\u003e官方\u003c/a\u003e写得很清楚了~\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run --name wiz \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e--restart\u003cspan class=\"o\"\u003e=\u003c/span\u003ealways \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-it -d \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-v  ~/wizdata:/wiz/storage\u003cspan class=\"se\"\u003e\\ \u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-v  /etc/localtime:/etc/localtime \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-p 8080:80 \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-p 9269:9269/udp \u003cspan class=\"se\"\u003e\\ \u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewiznote/wizserver \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"nginx-反代\"\u003enginx 反代\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003eHost\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eReal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eIP\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eremote_addr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eForwarded\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eFor\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproxy_add_x_forwarded_for\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ewiz\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ereal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eip\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eremote_addr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eForwarded\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eProto\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escheme\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eproxy_pass\u003c/span\u003e \u003cspan class=\"nl\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"c1\"\u003e//ip:8081;  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/12/04/image883fc7b6466fafdb.png\"\u003e\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/12/04/image75d41fa5e78951f8.png\"\u003e\u003c/p\u003e","title":"为知笔记 Docker版本 私有部署"},{"content":"SYS独服 24.99欧元 标准配置 SYS-2-SAT-32 Server - Intel Xeon D1540 - 32GB DDR3 ECC 2133MHz - 4x 2To HDD Soft RAID 250Mbps\n开机结果 cpu升级为 Intel Xeon D1541\n硬盘升级为 4x4T\n开了3台结果如下:\n1 2 3 12-01 21:23 GRA2 d1541 4x4T 250m 硬盘均 120小时 12-02 13:02 GRA1 d1541 4x4T G口 3个硬盘6k小时，1个110小时 12-02 13:30 GRA1 d1541 4x4T 250m 3个新盘，1个1k小时 准高配：D-1540+16T硬盘+250Mbps网络\n高配：D-1541CPU+16T硬盘+250Mbps网络\n顶配：D-1541CPU+16T硬盘+1Gbps网络\nKS独服 14.99欧元 标准配置 1 KS-LE Server - Intel Xeon E5-1620v2 - 32GB DDR3 ECC 1133MHz - 2x 2To HDD Soft RAID 100Mbps 开机结果 机器1 1 2 3 4 5 6 7 8 RBX3 Intel Xeon E5-1620v2 32GB DDR3 ECC 1133MHz 2x 2To 100m上传 机器2: 1 2 3 4 5 6 7 8 BHS2 Intel Xeon E5-1620v2 32GB DDR3 ECC 1133MHz 2x 2To G口上传 总结了下，看到let/loc上有人中奖，大概在30分钟内去开奖，大概率会中奖~\n","permalink":"https://blog.curlc.com/archives/1001/","summary":"\u003ch2 id=\"sys独服-2499欧元\"\u003eSYS独服 24.99欧元\u003c/h2\u003e\n\u003ch3 id=\"标准配置\"\u003e标准配置\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eSYS-2-SAT-32 Server - Intel Xeon D1540 - 32GB DDR3 ECC 2133MHz - 4x 2To HDD Soft RAID  250Mbps\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"开机结果\"\u003e开机结果\u003c/h3\u003e\n\u003cp\u003ecpu升级为 Intel Xeon D1541\u003c/p\u003e\n\u003cp\u003e硬盘升级为 4x4T\u003c/p\u003e\n\u003cp\u003e开了3台结果如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e12-01 21:23 GRA2  d1541 4x4T  250m  硬盘均 120小时  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e12-02 13:02 GRA1  d1541 4x4T  G口  3个硬盘6k小时，1个110小时  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e12-02 13:30 GRA1  d1541 4x4T  250m 3个新盘，1个1k小时\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e准高配：D-1540+16T硬盘+250Mbps网络\u003cbr\u003e\n高配：D-1541CPU+16T硬盘+250Mbps网络\u003cbr\u003e\n顶配：D-1541CPU+16T硬盘+1Gbps网络\u003cimg loading=\"lazy\" src=\"https://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif\"\u003e\u003c/p\u003e\n\u003ch2 id=\"ks独服-1499欧元\"\u003eKS独服 14.99欧元\u003c/h2\u003e\n\u003ch3 id=\"标准配置-1\"\u003e标准配置\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eKS-LE Server - Intel Xeon E5-1620v2 - 32GB DDR3 ECC 1133MHz - 2x 2To HDD Soft RAID 100Mbps\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"开机结果-1\"\u003e开机结果\u003c/h3\u003e\n\u003ch4 id=\"机器1\"\u003e机器1\u003c/h4\u003e\n\u003cp\u003e \u003c/p\u003e","title":"2021黑五 杜甫收获"},{"content":"问题: 反序列化时实体类型为 int/Integer/Long 等等，而json字段为string，如下\n1 2 3 4 5 6 #json {\u0026#34;a\u0026#34;:\u0026#34;\u0026#34;} #伪代码 class test { private Integer a; } 解决方法: 为gson注册一个适配器\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import com.google.gson.JsonSyntaxException; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import java.io.IOException; public class IntTypeAdapter extends TypeAdapter\u0026lt;Integer\u0026gt; { @Override public void write(JsonWriter out, Integer value) throws IOException { out.value(value); } @Override public Integer read(JsonReader in) throws IOException { JsonToken peek = in.peek(); if (peek == JsonToken.NULL) { in.nextNull(); return null; } try { String result = in.nextString(); if (\u0026#34;\u0026#34;.equals(result)) { return null; } return Integer.parseInt(result); } catch (NumberFormatException e) { throw new JsonSyntaxException(e); } } } 1 2 3 4 private Gson gson = new GsonBuilder() .registerTypeHierarchyAdapter(Integer.class, new IntTypeAdapter()) //.registerTypeHierarchyAdapter(Long.class, new LongTypeAdapter()) .create(); 需要注意的是， registerTypeHierarchyAdapter 里的类型一定要准确，一开始百度出来的是用 Number，会无法进入适配器，比如 https://www.jianshu.com/p/081ab69cf9a8 ，注册的是 int和integer，但TypeAdapter 是number。\n参考文章:\nhttps://www.jianshu.com/p/081ab69cf9a8\nhttps://stackoverflow.com/questions/8863429/how-to-handle-a-numberformatexception-with-gson-in-deserialization-a-json-respon\n","permalink":"https://blog.curlc.com/archives/971/","summary":"\u003ch2 id=\"问题\"\u003e问题:\u003c/h2\u003e\n\u003cp\u003e反序列化时实体类型为 int/\u003cem\u003eInteger\u003c/em\u003e/Long 等等，而json字段为string，如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#json  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\u0026#34;a\u0026#34;:\u0026#34;\u0026#34;}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#伪代码  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eclass test {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  private Integer a;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"解决方法\"\u003e解决方法:\u003c/h2\u003e\n\u003cp\u003e为gson注册一个适配器\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ecom.google.gson.JsonSyntaxException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ecom.google.gson.TypeAdapter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ecom.google.gson.stream.JsonReader\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ecom.google.gson.stream.JsonToken\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ecom.google.gson.stream.JsonWriter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ejava.io.IOException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eIntTypeAdapter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003eextends\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eTypeAdapter\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eInteger\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nd\"\u003e@Override\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003ewrite\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eJsonWriter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eInteger\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"kd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eIOException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nd\"\u003e@Override\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eInteger\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eread\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eJsonReader\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ein\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eIOException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eJsonToken\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epeek\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ein\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003epeek\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epeek\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eJsonToken\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eNULL\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ein\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003enextNull\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ein\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003enextString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eequals\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eInteger\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eparseInt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eNumberFormatException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"k\"\u003ethrow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eJsonSyntaxException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eGson\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egson\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eGsonBuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eregisterTypeHierarchyAdapter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eInteger\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eIntTypeAdapter\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e//.registerTypeHierarchyAdapter(Long.class, new LongTypeAdapter())  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ecreate\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e需要注意的是，  registerTypeHierarchyAdapter 里的类型一定要准确，一开始百度出来的是用 Number，会无法进入适配器，比如 \u003ca href=\"https://www.jianshu.com/p/081ab69cf9a8\"\u003ehttps://www.jianshu.com/p/081ab69cf9a8\u003c/a\u003e ，注册的是 int和integer，但TypeAdapter 是number。\u003c/p\u003e","title":"gson java.lang.NumberFormatException: empty String"},{"content":"在测试 javax.mail 中的 imap 协议 idle 时会有olderClosedException异常。\n背景 在Messaging对象上调用方法并且拥有该对象的Folder由于某种原因而死亡时，将引发此异常。\n由于我没注意看文档，IMAPFolder.idle();是阻塞的而又没有循环读，导致直接关闭了资源~\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 收件箱中共633封邮件! 收件箱中共78封未读邮件! 收件箱中共0封新邮件! 收件箱中共0封已删除邮件! ------------------------开始解析邮件---------------------------------- 支持idle Got 1 new messages --------------------------------------------------- -----关闭资源----- 标题: Re:测试邮件推送 javax.mail.FolderClosedException at com.sun.mail.imap.IMAPMessage.getProtocol(IMAPMessage.java:169) at com.sun.mail.imap.IMAPMessage.loadBODYSTRUCTURE(IMAPMessage.java:1546) at com.sun.mail.imap.IMAPMessage.getDataHandler(IMAPMessage.java:808) at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1508) at io.qyi.qqBotManage.mail.mail$1.messagesAdded(mail.java:88) at javax.mail.event.MessageCountEvent.dispatch(MessageCountEvent.java:154) at javax.mail.EventQueue.run(EventQueue.java:170) at java.lang.Thread.run(Thread.java:745) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 import com.sun.mail.imap.IMAPFolder; import javax.mail.*; import javax.mail.event.MessageCountAdapter; import javax.mail.event.MessageCountEvent; import java.io.IOException; import java.util.Properties; /** * @author LuoYe * @version 1.0 * @description: TODO * @date 2021/5/12 3:13 */ public class mail { public static void main(String[] args) throws MessagingException, IOException { init(); } public static void init() throws MessagingException, IOException { Properties props = new Properties(); props.setProperty(\u0026#34;mail.store.protocol\u0026#34;, \u0026#34;imap\u0026#34;); props.setProperty(\u0026#34;mail.imap.host\u0026#34;, \u0026#34;outlook.office365.com\u0026#34;); props.setProperty(\u0026#34;mail.imap.port\u0026#34;, \u0026#34;993\u0026#34;); /*tls与https需要增加以下代码*/ props.setProperty(\u0026#34;mail.imap.socketFactory.class\u0026#34;, \u0026#34;javax.net.ssl.SSLSocketFactory\u0026#34;); props.setProperty(\u0026#34;mail.imap.socketFactory.fallback\u0026#34;, \u0026#34;false\u0026#34;); props.setProperty(\u0026#34;mail.imap.socketFactory.port\u0026#34;, \u0026#34;993\u0026#34;); Session session = Session.getInstance(props); // 创建IMAP协议的Store对象 Store store = session.getStore(\u0026#34;imap\u0026#34;); // 连接邮件服务器 store.connect(\u0026#34;账户\u0026#34;, \u0026#34;密码\u0026#34;); // 获得收件箱 Folder folder = store.getFolder(\u0026#34;INBOX\u0026#34;); // 以读写模式打开收件箱 folder.open(Folder.READ_WRITE); // 获得收件箱的邮件列表 Message[] messages = folder.getMessages(); // 打印不同状态的邮件数量 System.out.println(\u0026#34;收件箱中共\u0026#34; + messages.length + \u0026#34;封邮件!\u0026#34;); System.out.println(\u0026#34;收件箱中共\u0026#34; + folder.getUnreadMessageCount() + \u0026#34;封未读邮件!\u0026#34;); System.out.println(\u0026#34;收件箱中共\u0026#34; + folder.getNewMessageCount() + \u0026#34;封新邮件!\u0026#34;); System.out.println(\u0026#34;收件箱中共\u0026#34; + folder.getDeletedMessageCount() + \u0026#34;封已删除邮件!\u0026#34;); System.out.println(\u0026#34;------------------------开始解析邮件----------------------------------\u0026#34;); // 解析邮件 /*for (Message message : messages) { IMAPMessage msg = (IMAPMessage) message; String subject = MimeUtility.decodeText(msg.getSubject()); System.out.println(\u0026#34;[\u0026#34; + subject + \u0026#34;]未读，是否需要阅读此邮件（y/n）？\u0026#34;); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String answer = reader.readLine(); if (\u0026#34;y\u0026#34;.equalsIgnoreCase(answer)) { System.out.println(msg.getContent().toString()); // POP3ReceiveMailTest.parseMessage(msg);\t// 解析邮件 // 第二个参数如果设置为true，则将修改反馈给服务器。false则不反馈给服务器 // msg.setFlag(Flag.SEEN, true);\t//设置已读标志 } }*/ folder.addMessageCountListener(new MessageCountAdapter() { @Override public void messagesAdded(MessageCountEvent e) { // super.messagesAdded(e); Message[] msgs = e.getMessages(); System.out.println(\u0026#34;Got \u0026#34; + msgs.length + \u0026#34; new messages\u0026#34;); for (Message msg : msgs) { System.out.println(\u0026#34;---------------------------------------------------\u0026#34;); try { System.out.println(\u0026#34;标题: \u0026#34; + msg.getSubject()); System.out.println(\u0026#34;内容: \u0026#34; + msg.getContent().toString()); } catch (MessagingException messagingException) { messagingException.printStackTrace(); } catch (IOException ioException) { ioException.printStackTrace(); } } } @Override public void messagesRemoved(MessageCountEvent e) { super.messagesRemoved(e); } }); if (folder instanceof IMAPFolder) { System.out.println(\u0026#34;支持idle\u0026#34;); IMAPFolder f = (IMAPFolder) folder; f.idle(); } System.out.println(\u0026#34;-----关闭资源-----\u0026#34;); // 关闭资源 folder.close(false); store.close(); } } ","permalink":"https://blog.curlc.com/archives/940/","summary":"\u003cp\u003e在测试 javax.mail 中的 imap 协议 idle 时会有olderClosedException异常。\u003c/p\u003e\n\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e在Messaging对象上调用方法并且拥有该对象的Folder由于某种原因而死亡时，将引发此异常。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e由于我没注意看文档，IMAPFolder.idle();是阻塞的而又没有循环读，导致直接关闭了资源~\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e收件箱中共\u003c/span\u003e\u003cspan class=\"mi\"\u003e633\u003c/span\u003e\u003cspan class=\"err\"\u003e封邮件\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e收件箱中共\u003c/span\u003e\u003cspan class=\"mi\"\u003e78\u003c/span\u003e\u003cspan class=\"err\"\u003e封未读邮件\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e收件箱中共\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"err\"\u003e封新邮件\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e收件箱中共\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"err\"\u003e封已删除邮件\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e------------------------\u003c/span\u003e\u003cspan class=\"err\"\u003e开始解析邮件\u003c/span\u003e\u003cspan class=\"o\"\u003e----------------------------------\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e支持\u003c/span\u003e\u003cspan class=\"n\"\u003eidle\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eGot\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003emessages\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e---------------------------------------------------\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e-----\u003c/span\u003e\u003cspan class=\"err\"\u003e关闭资源\u003c/span\u003e\u003cspan class=\"o\"\u003e-----\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e标题\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRe\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"err\"\u003e测试邮件推送\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ejavax\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFolderClosedException\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eat\u003c/span\u003e \u003cspan class=\"n\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esun\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eimap\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIMAPMessage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetProtocol\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIMAPMessage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejava\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e169\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eat\u003c/span\u003e \u003cspan class=\"n\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esun\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eimap\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIMAPMessage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eloadBODYSTRUCTURE\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIMAPMessage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejava\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1546\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eat\u003c/span\u003e \u003cspan class=\"n\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esun\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eimap\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIMAPMessage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetDataHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIMAPMessage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejava\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e808\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eat\u003c/span\u003e \u003cspan class=\"n\"\u003ejavax\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einternet\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMimeMessage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetContent\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMimeMessage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejava\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1508\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eat\u003c/span\u003e \u003cspan class=\"n\"\u003eio\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eqyi\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eqqBotManage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.\u003c/span\u003e\u003cspan class=\"n\"\u003emessagesAdded\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejava\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e88\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eat\u003c/span\u003e \u003cspan class=\"n\"\u003ejavax\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMessageCountEvent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edispatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMessageCountEvent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejava\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e154\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eat\u003c/span\u003e \u003cspan class=\"n\"\u003ejavax\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003email\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eEventQueue\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eEventQueue\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejava\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e170\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eat\u003c/span\u003e \u003cspan class=\"n\"\u003ejava\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elang\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eThread\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ne\"\u003eThread\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejava\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e745\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e  1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ecom.sun.mail.imap.IMAPFolder\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ejavax.mail.*\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ejavax.mail.event.MessageCountAdapter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ejavax.mail.event.MessageCountEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ejava.io.IOException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ejava.util.Properties\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @author LuoYe  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @version 1.0  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @description: TODO  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e * @date 2021/5/12 3:13  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e */\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003email\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e[]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMessagingException\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eIOException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMessagingException\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eIOException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eProperties\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eprops\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eProperties\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eprops\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mail.store.protocol\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;imap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eprops\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mail.imap.host\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;outlook.office365.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eprops\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mail.imap.port\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;993\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"cm\"\u003e/*tls与https需要增加以下代码*/\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eprops\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mail.imap.socketFactory.class\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;javax.net.ssl.SSLSocketFactory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eprops\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mail.imap.socketFactory.fallback\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eprops\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mail.imap.socketFactory.port\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;993\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSession\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esession\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eSession\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetInstance\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eprops\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 创建IMAP协议的Store对象  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eStore\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003estore\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esession\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetStore\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;imap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 连接邮件服务器  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003estore\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003econnect\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;账户\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;密码\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 获得收件箱  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eFolder\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efolder\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003estore\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetFolder\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;INBOX\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 以读写模式打开收件箱  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efolder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eFolder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eREAD_WRITE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 获得收件箱的邮件列表  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eMessage\u003c/span\u003e\u003cspan class=\"o\"\u003e[]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emessages\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efolder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetMessages\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 打印不同状态的邮件数量  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;收件箱中共\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emessages\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003elength\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;封邮件!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;收件箱中共\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efolder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetUnreadMessageCount\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;封未读邮件!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;收件箱中共\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efolder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetNewMessageCount\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;封新邮件!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;收件箱中共\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efolder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetDeletedMessageCount\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;封已删除邮件!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;------------------------开始解析邮件----------------------------------\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 解析邮件  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"cm\"\u003e/*for (Message message : messages) {  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e            IMAPMessage msg = (IMAPMessage) message;  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e            String subject = MimeUtility.decodeText(msg.getSubject());  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e            System.out.println(\u0026#34;[\u0026#34; + subject + \u0026#34;]未读，是否需要阅读此邮件（y/n）？\u0026#34;);  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e            String answer = reader.readLine();  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e            if (\u0026#34;y\u0026#34;.equalsIgnoreCase(answer)) {  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e                System.out.println(msg.getContent().toString());  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e                // POP3ReceiveMailTest.parseMessage(msg);\t// 解析邮件  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e                // 第二个参数如果设置为true，则将修改反馈给服务器。false则不反馈给服务器  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e                // msg.setFlag(Flag.SEEN, true);\t//设置已读标志\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e            }  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e        }*/\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efolder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eaddMessageCountListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMessageCountAdapter\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nd\"\u003e@Override\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emessagesAdded\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMessageCountEvent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"c1\"\u003e// super.messagesAdded(e);  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"n\"\u003eMessage\u003c/span\u003e\u003cspan class=\"o\"\u003e[]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsgs\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetMessages\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Got \u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsgs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003elength\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34; new messages\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMessage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsgs\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;---------------------------------------------------\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;标题: \u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetSubject\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;内容: \u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetContent\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"na\"\u003etoString\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMessagingException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emessagingException\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                        \u003c/span\u003e\u003cspan class=\"n\"\u003emessagingException\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIOException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eioException\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                        \u003c/span\u003e\u003cspan class=\"n\"\u003eioException\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nd\"\u003e@Override\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emessagesRemoved\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMessageCountEvent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"kd\"\u003esuper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003emessagesRemoved\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efolder\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003einstanceof\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eIMAPFolder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;支持idle\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eIMAPFolder\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIMAPFolder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efolder\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eidle\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;-----关闭资源-----\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 关闭资源  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efolder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003estore\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eclose\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"javax.mail.FolderClosedException 异常"},{"content":" 1 An HTTP_REFERER was detected other than what is defined in System -\u0026gt; Advanced (http://x.x.x.x/services_dhcp.php). If not needed, this check can be disabled in System -\u0026gt; Advanced -\u0026gt; Admin 问题: 由于服务器有多个ip，所以我就想装一个软路由来统一控制，刚装上pfSense 就无法在web登录，google搜索了半天才搜到，还是错的\u0026hellip;\u0026hellip;\n解决办法: 1、vnc进入 PHP shell + pfSense tools\n2、执行 playback disableref erercheck\n注意: 一开始我搜索到的解决办法是由pfSsh.php执行，也就是\n1 pfSsh.php playback disablereferercheck 但是在新版(2.5.0)执行无任何效果，低于这个版本的可以尝试这条命令。\n","permalink":"https://blog.curlc.com/archives/902/","summary":"\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAn HTTP_REFERER was detected other than what is defined in System -\u0026gt; Advanced (http://x.x.x.x/services_dhcp.php). If not needed, this check can be disabled in System -\u0026gt; Advanced -\u0026gt; Admin\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"问题\"\u003e问题:\u003c/h2\u003e\n\u003cp\u003e由于服务器有多个ip，所以我就想装一个软路由来统一控制，刚装上pfSense 就无法在web登录，google搜索了半天才搜到，还是错的\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"解决办法\"\u003e解决办法:\u003c/h2\u003e\n\u003cp\u003e1、vnc进入 PHP shell + pfSense tools\u003c/p\u003e\n\u003cp\u003e2、执行 playback disableref erercheck\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch2 id=\"注意\"\u003e注意:\u003c/h2\u003e\n\u003cp\u003e一开始我搜索到的解决办法是由pfSsh.php执行，也就是\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epfSsh.php playback disablereferercheck\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e但是在新版(2.5.0)执行无任何效果，低于这个版本的可以尝试这条命令。\u003c/p\u003e","title":"pfSense HTTP_REFERER 登录校验问题"},{"content":"为啥要搞这个脚本呢，是真的被恶心到了，我记得我还是从高二开始就用的小米，MIUI从以前的真香，变成BUG一堆、负优化的UI。买了个小米11，到手3个月真心被这系统恶心到了，越更新越辣鸡，什么哈曼音效砍了(MIUI 12.0.22),4600ma的电池用着和老手机没什么区别，1月份首发到手，结果现在4月初所谓的MIUI12.5还没出来，以前可以随便刷开发版，现在也要个申请，关键是tmd不让过，无法了\u0026hellip;\u0026hellip;\n这个脚本本来是打算为了答题申请内测，现在搞完反而没想法了，等用坏了以后就不用小米手机。\n本脚本仅交流使用，不提供任何技术支持。\n效果如下：\n脚本运行环境是auto.js免费版4.0，看了半个小时直接开始撸了，附带采集功能，题库中没有的题目自动入库，代码如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 toast(\u0026#34;开始运行!\u0026#34;); // click(\u0026#34;再次答题\u0026#34;); // click(\u0026#34;同意协议并开始答题\u0026#34;); var myAPP = {}; // 唯一的全局变量myAPP myAPP.packageName = \u0026#34;com.xiaomi.vipaccount\u0026#34;; console.log(\u0026#39;查找题目\u0026#39;); var patt = /，，.*(?=多选题|单选题)/g; for (let i = 0; i \u0026lt; 40; i++) { let title = textContains(\u0026#34;选题\u0026#34;).findOne().text(); console.log(\u0026#39;?????????\u0026#39;) var reg=new RegExp(patt); var result = reg.exec(title); // console.log(\u0026#39;题目\u0026#39;,title); title = result[0].replace(\u0026#39;，，\u0026#39;,\u0026#39;\u0026#39;).replace(\u0026#39; \u0026#39;,\u0026#39;\u0026#39;); console.log(result[0]); // break; if (title == undefined) { continue; } console.log(\u0026#34;题目:\u0026#34;, title); // console.log(title.textMatches(patt)); let an; try { an = textContains(\u0026#34;未选中\u0026#34;).find(); } catch (error) { console.log(\u0026#39;异常\u0026#39;); } /*增加题目到题库*/ let post = {}; post.question = title; for (let i = 0; i \u0026lt; an.length; i++) { let an_t = an[i].text().replace(\u0026#39;，未选中\u0026#39;, \u0026#39;\u0026#39;); if (i === 0) { post.answer_a = an_t; } else if (i === 1) { post.answer_b = an_t; } else if (i === 2) { post.answer_c = an_t; } else if (i === 3) { post.answer_d = an_t; } } // console.log(JSON.stringify(post)); let url = \u0026#34;http://192.168.15.227:8012/add_question\u0026#34;; let url_select = \u0026#34;http://192.168.15.227:8012/getQuestion?title=\u0026#34; + title; var r = http.get(url_select); var data_j = JSON.parse(r.body.string()); console.log(\u0026#39;返回结果:\u0026#39;, data_j); if(data_j.code === -1){ // 没有题库，直接提交到数据库 http.postJson(url, post); console.log(post); click(post.answer_a + \u0026#34;，未选中\u0026#34;); sleep(1000); click(\u0026#34;下一题\u0026#34;); }else{ // data_j. var nc = Number(data_j.data.answer); console.log(\u0026#39;答案\u0026#39;,nc); if ((nc \u0026amp; 16) === 16) { console.log(\u0026#39;点击\u0026#39;,data_j.data.answer_a + \u0026#39;，未选中\u0026#39;); click(data_j.data.answer_a); } if ((nc \u0026amp; 32) === 32) { console.log(\u0026#39;点击\u0026#39;,data_j.data.answer_b + \u0026#39;，未选中\u0026#39;); click(data_j.data.answer_b); } if ((nc \u0026amp; 64) === 64) { console.log(\u0026#39;点击\u0026#39;,data_j.data.answer_c +\u0026#39;，未选中\u0026#39;); click(data_j.data.answer_c); } if ((nc \u0026amp; 128) === 128) { console.log(\u0026#39;点击\u0026#39;,data_j.data.answer_d + \u0026#39;，未选中\u0026#39;); click(data_j.data.answer_d); } sleep(1000); click(\u0026#34;下一题\u0026#34;); } } 不知道为啥，正则那里用了前置断言就报错\u0026hellip;\u0026hellip;\n至于服务的的代码其实也就搜索与保存数据库而已，使用的是mybatis plus，H2数据库\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @RequestMapping(\u0026#34;/add_question\u0026#34;) public Result add_question(@RequestBody MiuiQuestion miuiQuestion) { log.info(miuiQuestion.toString()); int size = miuiQuestionService.list(new QueryWrapper\u0026lt;MiuiQuestion\u0026gt;().eq(\u0026#34;question\u0026#34;, miuiQuestion.getQuestion())).size(); if (size \u0026gt; 0) { return ResultUtil.success(\u0026#34;已有数据\u0026#34;); } miuiQuestionService.save(miuiQuestion); return ResultUtil.success(); } @RequestMapping(\u0026#34;/getQuestion\u0026#34;) public Result getQuestion(String title) { List\u0026lt;MiuiQuestion\u0026gt; question = miuiQuestionService.list(new QueryWrapper\u0026lt;MiuiQuestion\u0026gt;().eq(\u0026#34;question\u0026#34;, title)); if (question.size() == 0) { return ResultUtil.error(-1, \u0026#34;没有查找到题目\u0026#34;); } return ResultUtil.success(question.get(0)); } 采集10来分钟的题库如下，不保证准确性，我也是网上搜索的答案：\n答案解析方法如下：\n16 =\u0026gt; A\n32 =\u0026gt; B\n64 =\u0026gt; C\n128 =\u0026gt; D\n分别对答案进行 与 运算，比如 答案为208，分别与 16、32、64、128 与 运算后的结果为 16、0、64、128，那么答案就是 A、C、D\nSQL：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (146, \u0026#39;下面哪项不属于MIUI12新功能？\u0026#39;, \u0026#39;超级壁纸\u0026#39;, \u0026#39;照明弹\u0026#39;, \u0026#39;地震预警\u0026#39;, \u0026#39;动态天气\u0026#39;, \u0026#39;192\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (147, \u0026#39;开发版切换为稳定版时会清除手机数据吗？\u0026#39;, \u0026#39;有时候会，有时候不会\u0026#39;, \u0026#39;会\u0026#39;, \u0026#39;不会\u0026#39;, null, \u0026#39;32\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (148, \u0026#39;关于开发版公测和开发版内测，下列说法正确的是？\u0026#39;, \u0026#39;开发版内测的更新频率更高\u0026#39;, \u0026#39;两者更新内容有差异\u0026#39;, \u0026#39;开发版公测的稳定性更低\u0026#39;, \u0026#39;两者都有可能遇到系统bug\u0026#39;, \u0026#39;176\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (149, \u0026#39;下列说法或行为，不正确的有：\u0026#39;, \u0026#39;在MIUI系统圈内反馈内测功能bug\u0026#39;, \u0026#39;开发版公测是最不稳定的系统测试版本\u0026#39;, \u0026#39;稳定版内测可能存在不稳定性\u0026#39;, \u0026#39;建立内测交流群分享系统测试包\u0026#39;, \u0026#39;176\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (150, \u0026#39;如何进入开发者模式？\u0026#39;, \u0026#39;打开设置-我的设备-全部参数，连击Android版本\u0026#39;, \u0026#39;打开设置-我的设备-全部参数，连击内核版本\u0026#39;, \u0026#39;打开设置-我的设备-MIUI版本，连击MIUI图标\u0026#39;, \u0026#39;打开设置-我的设备-全部参数，连击MIUI版本\u0026#39;, \u0026#39;128\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (151, \u0026#39;如果刷机提示需备份数据，备份至哪里有效？\u0026#39;, \u0026#39;电脑本地\u0026#39;, \u0026#39;云\u0026#39;, \u0026#39;手机本地\u0026#39;, null, \u0026#39;48\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (152, \u0026#39;开发版公测的更新频率？\u0026#39;, \u0026#39;每月更新\u0026#39;, \u0026#39;每周更新\u0026#39;, \u0026#39;每半个月更新\u0026#39;, \u0026#39;每天更新\u0026#39;, \u0026#39;32\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (153, \u0026#39;手机出厂时，默认会是哪个版本？\u0026#39;, \u0026#39;内测稳定版\u0026#39;, \u0026#39;内测开发版\u0026#39;, \u0026#39;公测开发版\u0026#39;, \u0026#39;公测稳定版\u0026#39;, \u0026#39;128\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (154, \u0026#39;关于刷机过程，下列说法正确的是？\u0026#39;, \u0026#39;过程中不要随意打断\u0026#39;, \u0026#39;按教程正常操作就不可能变砖\u0026#39;, \u0026#39;保持手机电量充足\u0026#39;, \u0026#39;注意备份手机数据\u0026#39;, \u0026#39;208\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (155, \u0026#39;更新系统时遇到“卡米”怎么办？\u0026#39;, \u0026#39;连接电脑线刷\u0026#39;, \u0026#39;不存在卡米\u0026#39;, \u0026#39;反复按电源键\u0026#39;, \u0026#39;寻找客服帮助\u0026#39;, \u0026#39;144\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (156, \u0026#39;关于卡刷和线刷，下列说法正确的是？\u0026#39;, \u0026#39;线刷要用数据线连接手机和电脑\u0026#39;, \u0026#39;卡刷主要应用在系统更新升级\u0026#39;, \u0026#39;系统或软件故障时可以尝试线刷来解决\u0026#39;, \u0026#39;卡刷会刷新整个手机分区\u0026#39;, \u0026#39;80\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (157, \u0026#39;如何下载安装新的系统内测包？\u0026#39;, \u0026#39;进入相应产品圈下载\u0026#39;, \u0026#39;进入内测详情页下载\u0026#39;, \u0026#39;进入系统更新页面检测\u0026#39;, \u0026#39;发帖求更新包下载资源\u0026#39;, \u0026#39;112\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (158, \u0026#39;MIUI系统稳定性，由大到小的排序是？\u0026#39;, \u0026#39;稳定版内测＞稳定版公测＞开发版公测＞开发版内测\u0026#39;, \u0026#39;开发版公测＞开发版内测＞稳定版内测＞稳定版公测\u0026#39;, \u0026#39;稳定版内测＞开发版内测＞开发版公测＞稳定版公测\u0026#39;, \u0026#39;稳定版公测＞稳定版内测＞开发版公测＞开发版内测\u0026#39;, \u0026#39;128\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (159, \u0026#39;刷机变砖了怎么办？\u0026#39;, \u0026#39;反复拍打手机尝试拯救\u0026#39;, \u0026#39;可尝试进入recovery模式\u0026#39;, \u0026#39;可尝试进入fastboot模式\u0026#39;, \u0026#39;到官方维修点咨询解决\u0026#39;, \u0026#39;192\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (160, \u0026#39;MIUI稳定版到开发版的升级一般通过什么方式？\u0026#39;, \u0026#39;线刷\u0026#39;, \u0026#39;卡刷\u0026#39;, \u0026#39;OTA\u0026#39;, \u0026#39;以上都不是\u0026#39;, \u0026#39;32\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (161, \u0026#39;使用内测或公测系统时遇到问题该怎么做？\u0026#39;, \u0026#39;查看相应圈子内的已解决的提案\u0026#39;, \u0026#39;发帖问候MIUI工程师\u0026#39;, \u0026#39;在相应产品圈发帖反馈\u0026#39;, \u0026#39;不影响正常使用时无视该问题\u0026#39;, \u0026#39;80\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (162, \u0026#39;系统更新页面中，找不到“手动选择安装包”怎么办？\u0026#39;, \u0026#39;连击页面中MIUI版本logo\u0026#39;, \u0026#39;是系统版本有问题，重新刷机\u0026#39;, \u0026#39;长按页面中MIUI版本logo\u0026#39;, \u0026#39;重启试试\u0026#39;, \u0026#39;16\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (163, \u0026#39;特定机型的开发版停止维护后，想继续正常使用手机，该怎么办？\u0026#39;, \u0026#39;刷其他机型的开发版\u0026#39;, \u0026#39;等待自动更新到稳定版\u0026#39;, \u0026#39;手动刷回稳定版\u0026#39;, null, \u0026#39;32\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (164, \u0026#39;请问米粉节的时间是？\u0026#39;, \u0026#39;4月6日\u0026#39;, \u0026#39;7月8日\u0026#39;, \u0026#39;9月24日\u0026#39;, \u0026#39;12月1日\u0026#39;, \u0026#39;16\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (165, \u0026#39;下面哪项不属于MIUI11新功能？\u0026#39;, \u0026#39;超级省电\u0026#39;, \u0026#39;地震预警\u0026#39;, \u0026#39;传送门\u0026#39;, \u0026#39;Mi Work套件\u0026#39;, \u0026#39;64\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (166, \u0026#39;内测遇到bug时，不应采取的措施是？\u0026#39;, \u0026#39;去MIUI系统的圈子发帖询问\u0026#39;, \u0026#39;在内测或公测群组内询问\u0026#39;, \u0026#39;去内测或公测的圈子发帖反馈\u0026#39;, \u0026#39;在服务与反馈APP中提交反馈\u0026#39;, \u0026#39;32\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (167, \u0026#39;手机“BL锁”的全称是什么？\u0026#39;, \u0026#39;BootLoader\u0026#39;, \u0026#39;BootLocker\u0026#39;, \u0026#39;BootLock\u0026#39;, \u0026#39;BootLeader\u0026#39;, \u0026#39;16\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (168, \u0026#39;刷机后无法进入系统，一直重启，怎么办？\u0026#39;, \u0026#39;尝试重新刷入完整包\u0026#39;, \u0026#39;联系小米客服\u0026#39;, \u0026#39;反复拍打手机尝试拯救\u0026#39;, null, \u0026#39;48\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (169, \u0026#39;全面屏手势是在哪个MIUI版本上线的？\u0026#39;, \u0026#39;MIUI8\u0026#39;, \u0026#39;MIUI9\u0026#39;, \u0026#39;MIUI10\u0026#39;, \u0026#39;MIUI11\u0026#39;, \u0026#39;64\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (170, \u0026#39;MIUI12的发布日期？\u0026#39;, \u0026#39;4月16日\u0026#39;, \u0026#39;5月21日\u0026#39;, \u0026#39;6月1日\u0026#39;, \u0026#39;4月27日\u0026#39;, \u0026#39;128\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (171, \u0026#39;关于刷机中的fastboot模式和recovery模式，下列说法错误的有？\u0026#39;, \u0026#39;可以进入recovery模式进行卡刷\u0026#39;, \u0026#39;recovery模式是一种比fastboot更底层的刷机模式\u0026#39;, \u0026#39;fastboot模式也叫恢复模式\u0026#39;, \u0026#39;可以进入fastboot模式进行线刷\u0026#39;, \u0026#39;96\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (172, \u0026#39;你怎么看待给朋友分享系统测试包？\u0026#39;, \u0026#39;不上传到公众平台，没什么大问题\u0026#39;, \u0026#39;不应该这么做\u0026#39;, \u0026#39;可能会被取消测试权限\u0026#39;, \u0026#39;不被发现就没关系\u0026#39;, \u0026#39;96\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (173, \u0026#39;关于测试版系统，你认为以下说法正确的有？ \u0026#39;, \u0026#39;测试版稳定性不可预估，要做好风险准备\u0026#39;, \u0026#39;测试版是提供给少数具有极客精神资深用户的版本\u0026#39;, \u0026#39;使用测试版遇到bug是正常的，要积极理性反馈\u0026#39;, \u0026#39;测试版用户正常情况下不会遇到bug\u0026#39;, \u0026#39;112\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (174, \u0026#39;通常说的MIUI测试是__色星期__?\u0026#39;, \u0026#39;橙色，一\u0026#39;, \u0026#39;橙色，五\u0026#39;, \u0026#39;红色，一\u0026#39;, \u0026#39;红色，五\u0026#39;, \u0026#39;32\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (175, \u0026#39;系统内测的有效期为？\u0026#39;, \u0026#39;1个月\u0026#39;, \u0026#39;3个月\u0026#39;, \u0026#39;半年\u0026#39;, \u0026#39;1年\u0026#39;, \u0026#39;32\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (176, \u0026#39;开发版内测的更新频率？\u0026#39;, \u0026#39;工作日星期一到星期四\u0026#39;, \u0026#39;每半个月更新\u0026#39;, \u0026#39;每周更新\u0026#39;, \u0026#39;每月更新\u0026#39;, \u0026#39;16\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (177, \u0026#39;所有MIUI版本里更新最频繁，新功能和bug修复最及时的版本是？\u0026#39;, \u0026#39;开发版公测\u0026#39;, \u0026#39;开发版内测\u0026#39;, \u0026#39;稳定版公测\u0026#39;, \u0026#39;稳定版内测\u0026#39;, \u0026#39;32\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (178, \u0026#39;当天更新机型列表中，没有自己使用的机型，应该怎么做？\u0026#39;, \u0026#39;可能为解决版本稳定性问题未发布，理性看待\u0026#39;, \u0026#39;关注后续版本更新\u0026#39;, null, null, \u0026#39;48\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (179, \u0026#39;开发版内测公告，一般发布时间是？\u0026#39;, \u0026#39;上午11点左右\u0026#39;, \u0026#39;中午12点左右\u0026#39;, \u0026#39;晚上12点左右\u0026#39;, \u0026#39;下午4点左右\u0026#39;, \u0026#39;128\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (180, \u0026#39;为什么反馈问题，希望上传日志？\u0026#39;, \u0026#39;帮助更完整了解，问题出现时系统情况\u0026#39;, \u0026#39;帮助更快修复问题\u0026#39;, \u0026#39;帮助开发组，定位问题出现原因\u0026#39;, null, \u0026#39;112\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (181, \u0026#39;怎么详细描述，能帮问题更快修复？\u0026#39;, \u0026#39;详细描述问题出现的机型和版本\u0026#39;, \u0026#39;详细描述问题发生场景和步骤（越详细越好）\u0026#39;, \u0026#39;带上Log或截图\u0026#39;, \u0026#39;详细描述问题复现概率\u0026#39;, \u0026#39;240\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (182, \u0026#39;如何进入fastboot？\u0026#39;, \u0026#39;关机状态下长按音量－键和电源键\u0026#39;, \u0026#39;关机状态下长按音量+音量－和电源键\u0026#39;, \u0026#39;关机状态下长按音量+键和电源键\u0026#39;, \u0026#39;关机状态下长按音量+和音量-键\u0026#39;, \u0026#39;16\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (183, \u0026#39;线刷时需要注意什么？\u0026#39;, \u0026#39;提前备份好数据\u0026#39;, \u0026#39;解锁BootLoader\u0026#39;, \u0026#39;保证电脑与手机之间连接稳定\u0026#39;, null, \u0026#39;112\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (184, \u0026#39;如何解除手机“BL锁”？\u0026#39;, \u0026#39;MTK模式\u0026#39;, \u0026#39;Recovery模式\u0026#39;, \u0026#39;在官网提交申请后并按提示下载对应工具解锁\u0026#39;, \u0026#39;通过小米助手\u0026#39;, \u0026#39;64\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (185, \u0026#39;为什么有时候，会收到完整内测包？\u0026#39;, \u0026#39;修改过系统文件\u0026#39;, \u0026#39;超过7天未更新系统\u0026#39;, null, null, \u0026#39;48\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (186, \u0026#39;如何进入Recovery？\u0026#39;, \u0026#39;关机状态下长按音量+和音量-键\u0026#39;, \u0026#39;关机状态下长按音量+键和电源键\u0026#39;, \u0026#39;关机状态下长按音量－键和电源键\u0026#39;, \u0026#39;关机状态下长按音量+音量－和电源键\u0026#39;, \u0026#39;32\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (187, \u0026#39;你怎么看待测试版系统，会出现Bug？\u0026#39;, \u0026#39;以上都是\u0026#39;, \u0026#39;遇到问题，积极理性反馈\u0026#39;, \u0026#39;测试版是提供给少数具有极客精神资深用户的版本，用于问题反馈和测试\u0026#39;, \u0026#39;测试版稳定性不可预估\u0026#39;, \u0026#39;16\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (188, \u0026#39;帮助更快修复问题\u0026#39;, \u0026#39;详细描述问题发生场景和步骤（越详细越好）\u0026#39;, \u0026#39;详细描述问题复现概率\u0026#39;, \u0026#39;详细描述问题出现的机型和版本\u0026#39;, null, \u0026#39;112\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (189, \u0026#39;“快如闪电”出自MIUI哪个版本？\u0026#39;, \u0026#39;MIUI8\u0026#39;, \u0026#39;MIUI9\u0026#39;, \u0026#39;MIUI10\u0026#39;, \u0026#39;MIUI11\u0026#39;, \u0026#39;64\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (190, \u0026#39;参与测试遇到系统问题时，下列说法或行为哪些是正确的？\u0026#39;, \u0026#39;应该理性看待遇到的问题\u0026#39;, \u0026#39;不影响使用时无视问题\u0026#39;, \u0026#39;发帖反馈时，注意保护好隐私\u0026#39;, \u0026#39;积极反馈，详细描述问题出现时间、频率\u0026#39;, \u0026#39;208\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (191, \u0026#39;稳定版升级到开发版，会清除数据么？\u0026#39;, \u0026#39;不会\u0026#39;, \u0026#39;会\u0026#39;, \u0026#39;有时会，有时不会\u0026#39;, null, \u0026#39;32\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (192, \u0026#39;MIUI12的主题是？\u0026#39;, \u0026#39;动态天气\u0026#39;, \u0026#39;照明弹\u0026#39;, \u0026#39;超级壁纸\u0026#39;, \u0026#39;地震预警\u0026#39;, \u0026#39;64\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (200, \u0026#39;以下属于手机预装APP的是？\u0026#39;, \u0026#39;服务与反馈\u0026#39;, \u0026#39;北京银行APP\u0026#39;, \u0026#39;王者荣耀\u0026#39;, \u0026#39;夸克浏览器\u0026#39;, \u0026#39;16\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (202, \u0026#39;遇到问题在手机端服务与反馈APP上反馈如何提供有效的日志帮助研发更好的分析问题？\u0026#39;, \u0026#39;太麻烦了，不配合\u0026#39;, \u0026#39;服务与反馈APP上问题反馈界面右上角三个点有日志抓取工具\u0026#39;, \u0026#39;复现问题时在手机拨号界面根据不同的问题输入相应的暗码抓取日志，在已提交该问题的反馈上，点击左下角加号上传已抓取的日志\u0026#39;, null, \u0026#39;96\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (214, \u0026#39;关于稳定版内测和开发版内测，下列说法正确的是？\u0026#39;, \u0026#39; 稳定版内测的稳定性更低\u0026#39;, \u0026#39; 两者都有可能遇到系统bug\u0026#39;, \u0026#39; 两者更新内容有差异\u0026#39;, \u0026#39; 开发版内测的更新频率更高\u0026#39;, \u0026#39;224\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (215, \u0026#39;关于稳定版内测说法正确的是\u0026#39;, \u0026#39; 稳定版内测是稳定版公测前的小范围测试\u0026#39;, \u0026#39;稳定版内测存在不稳定性，请升级前做好数据备份\u0026#39;, \u0026#39; 稳定版内测没有固定发版规律，请勿催更\u0026#39;, \u0026#39;其他三项都是\u0026#39;, \u0026#39;128\u0026#39;); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (228, \u0026#39;关于测试版系统，你认为以下说法正确的有？\u0026#39;, \u0026#39; 使用测试版遇到bug是正常的，要积极理性反馈\u0026#39;, \u0026#39; 测试版是提供给少数具有极客精神资深用户的版本\u0026#39;, \u0026#39; 测试版用户正常情况下不会遇到bug\u0026#39;, \u0026#39; 测试版稳定性不可预估，要做好风险准备\u0026#39;, null); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (229, \u0026#39;稳定版内测的更新频率？\u0026#39;, \u0026#39; 每周更新\u0026#39;, \u0026#39; 每月更新\u0026#39;, \u0026#39; 每日更新\u0026#39;, \u0026#39; 无固定发版规律\u0026#39;, null); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (230, \u0026#39;稳定版与开发版相互切换时会清除手机数据吗？\u0026#39;, \u0026#39; 会\u0026#39;, \u0026#39; 不会\u0026#39;, null, null, null); INSERT INTO \u0026#34;public\u0026#34;.\u0026#34;miui_question\u0026#34; (\u0026#34;id\u0026#34;, \u0026#34;question\u0026#34;, \u0026#34;answer_a\u0026#34;, \u0026#34;answer_b\u0026#34;, \u0026#34;answer_c\u0026#34;, \u0026#34;answer_d\u0026#34;, \u0026#34;answer\u0026#34;) VALUES (231, \u0026#39;MIUI跨版本（如稳定版到开发版）的升级可以通过什么方式？\u0026#39;, \u0026#39; 卡刷\u0026#39;, \u0026#39; OTA\u0026#39;, \u0026#39; 线刷\u0026#39;, \u0026#39;其他三项都可以\u0026#39;, null); ","permalink":"https://blog.curlc.com/archives/880/","summary":"\u003cp\u003e为啥要搞这个脚本呢，是真的被恶心到了，我记得我还是从高二开始就用的小米，MIUI从以前的真香，变成BUG一堆、负优化的UI。买了个小米11，到手3个月真心被这系统恶心到了，越更新越辣鸡，什么哈曼音效砍了(MIUI 12.0.22),4600ma的电池用着和老手机没什么区别，1月份首发到手，结果现在4月初所谓的MIUI12.5还没出来，以前可以随便刷开发版，现在也要个申请，关键是tmd不让过，无法了\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e这个脚本本来是打算为了答题申请内测，现在搞完反而没想法了，等用坏了以后就不用小米手机。\u003c/p\u003e\n\u003cp\u003e本脚本仅交流使用，不提供任何技术支持。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/04/01/image8c1416e67201de53.png\"\u003e\u003c/p\u003e\n\u003cp\u003e效果如下：\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://p6.toutiaoimg.com/img/tos-cn-i-0022/e8f8a47b06d74884a4c24844f747bc53~tplv-obj:424:896.gif\"\u003e\u003c/p\u003e\n\u003cp\u003e脚本运行环境是auto.js免费版4.0，看了半个小时直接开始撸了，附带采集功能，题库中没有的题目自动入库，代码如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e82\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etoast\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;开始运行!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// click(\u0026#34;再次答题\u0026#34;);  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// click(\u0026#34;同意协议并开始答题\u0026#34;);  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003emyAPP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{};\u003c/span\u003e  \u003cspan class=\"c1\"\u003e// 唯一的全局变量myAPP   \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003emyAPP\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epackageName\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;com.xiaomi.vipaccount\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;查找题目\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003epatt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"sr\"\u003e/，，.*(?=多选题|单选题)/g\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"nx\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e40\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003etextContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;选题\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003efindOne\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;?????????\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ereg\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eRegExp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epatt\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eresult\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ereg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexec\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e// console.log(\u0026#39;题目\u0026#39;,title);  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;，，\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e// break;  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etitle\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"kc\"\u003eundefined\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;题目:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// console.log(title.textMatches(patt));  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003ean\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003ean\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003etextContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;未选中\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003efind\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003ecatch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;异常\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"cm\"\u003e/*增加题目到题库*/\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003epost\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{};\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003equestion\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"nx\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"nx\"\u003ean\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003ean_t\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ean\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;，未选中\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_a\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ean_t\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_b\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ean_t\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_c\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ean_t\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_d\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ean_t\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e// console.log(JSON.stringify(post));  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003eurl\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://192.168.15.227:8012/add_question\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003eurl_select\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://192.168.15.227:8012/getQuestion?title=\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"nx\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003er\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eurl_select\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eJSON\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eparse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;返回结果:\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecode\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// 没有题库，直接提交到数据库  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epostJson\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eclick\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003epost\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_a\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;，未选中\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003esleep\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eclick\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;下一题\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// data_j.  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003enc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eNumber\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;答案\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003enc\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nx\"\u003enc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"mi\"\u003e16\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"mi\"\u003e16\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;点击\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_a\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;，未选中\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003eclick\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_a\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nx\"\u003enc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"mi\"\u003e32\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"mi\"\u003e32\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;点击\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_b\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;，未选中\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003eclick\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_b\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nx\"\u003enc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"mi\"\u003e64\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"mi\"\u003e64\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;点击\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_c\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;，未选中\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003eclick\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_c\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"nx\"\u003enc\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e \u003cspan class=\"mi\"\u003e128\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"mi\"\u003e128\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;点击\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_d\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;，未选中\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003eclick\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edata_j\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eanswer_d\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003esleep\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eclick\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;下一题\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e不知道为啥，正则那里用了前置断言就报错\u0026hellip;\u0026hellip;\u003c/p\u003e","title":"小米内测自动答题脚本"},{"content":"背景 刚接触这个h2内存数据库，被这个问题折腾2天了，我使用的是mybatis-plus，而H2默认 表名、列名都是大写，和mybatis plus默认的策略有冲突(SQL大写变小写加下划线)，虽然可以配置关闭掉，但全部大写还是看着不习惯\u0026hellip;\u0026hellip;\n所以百度搜了下关闭的方法，在url链接上加上 DATABASE_TO_UPPER=FALSE 就行了，但这问题就来了，由于我加了 AUTO_SERVER=TRUE 也就是混合模式，在idea中修改数据就会\n报错: 1 2 3 4 5 [90079][90079] org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema \u0026#34;information_schema\u0026#34; not found; SQL statement: select catalog_name from information_schema.catalogs [90079-200]. Schema \u0026#34;information_schema\u0026#34; not found; SQL statement: select catalog_name from information_schema.catalogs [90079-200] (458 ms) 解决办法 后面搜索到 github同样有人遇到了这个问题，给出的解决方法是使用 DATABASE_TO_LOWER=TRUE\n参数。记得删除原来的库重新生成\n。\n我的配置如下：\n1 2 3 4 spring.datasource.url=jdbc:h2:./db/qq_bot;DATABASE_TO_LOWER=TRUE;AUTO_SERVER=TRUE;AUTO_SERVER_PORT=9092;USER=sa;PASSWORD=sa; #spring.datasource.h2.username=admin #spring.datasource.h2.password=admin spring.datasource.h2.driver-class-name=org.h2.Driver 至于我为啥把用户名密码配置在url里\u0026hellip;\u0026hellip;.那就是另外个问题了，哈哈哈\n使用H2需要注意的问题 1、如果修改了url配置，原来的数据库要删除重新生成，因为在第一次创建数据库的时候就写死了，无法修改。\n2、关于混合模式，我一直以为配置了，AUTO_SERVER=TRUE；AUTO_SERVER_PORT=9092; 就可以使用tcp直接连接进行修改了，虽然端口开放了但会说密码错误\n，其实只是可以使用相同的url再次连接而已。\n参考文章：\nhttps://github.com/h2database/h2database/issues/485\n","permalink":"https://blog.curlc.com/archives/876/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e刚接触这个h2内存数据库，被这个问题折腾2天了，我使用的是mybatis-plus，而H2默认 表名、列名都是大写，和mybatis plus默认的策略有冲突(SQL大写变小写加下划线)，虽然可以配置关闭掉，但全部大写还是看着不习惯\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e所以百度搜了下关闭的方法，在url链接上加上 DATABASE_TO_UPPER=FALSE 就行了，但这问题就来了，由于我加了 AUTO_SERVER=TRUE \u003c/p\u003e\n\u003cp\u003e也就是混合模式，在idea中修改数据就会\u003c/p\u003e\n\u003ch2 id=\"报错\"\u003e报错:\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[90079][90079] org.h2.jdbc.JdbcSQLSyntaxErrorException: Schema \u0026#34;information_schema\u0026#34; not found; SQL statement:  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eselect catalog_name from information_schema.catalogs [90079-200].  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSchema \u0026#34;information_schema\u0026#34; not found; SQL statement:  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eselect catalog_name from information_schema.catalogs [90079-200]  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e(458 ms)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/03/28/image717ee6b902512e2a.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"解决办法\"\u003e解决办法\u003c/h2\u003e\n\u003cp\u003e后面搜索到 github同样有人遇到了这个问题，给出的解决方法是使用 DATABASE_TO_LOWER=TRUE\u003c/p\u003e\n\u003cp\u003e参数。记得删除原来的库重新生成\u003c/p\u003e\n\u003cp\u003e。\u003c/p\u003e\n\u003cp\u003e我的配置如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yml\" data-lang=\"yml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.datasource.url=jdbc:h2:./db/qq_bot;DATABASE_TO_LOWER=TRUE;AUTO_SERVER=TRUE;AUTO_SERVER_PORT=9092;USER=sa;PASSWORD=sa;  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#spring.datasource.h2.username=admin  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#spring.datasource.h2.password=admin  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.datasource.h2.driver-class-name=org.h2.Driver\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e至于我为啥把用户名密码配置在url里\u0026hellip;\u0026hellip;.那就是另外个问题了，哈哈哈\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch2 id=\"使用h2需要注意的问题\"\u003e使用H2需要注意的问题\u003c/h2\u003e\n\u003cp\u003e1、如果修改了url配置，原来的数据库要删除重新生成，因为在第一次创建数据库的时候就写死了，无法修改。\u003c/p\u003e\n\u003cp\u003e2、关于混合模式，我一直以为配置了，AUTO_SERVER=TRUE；AUTO_SERVER_PORT=9092; 就可以使用tcp直接连接进行修改了，虽然端口开放了但会说密码错误\u003c/p\u003e\n\u003cp\u003e，其实只是可以使用相同的url再次连接而已。\u003c/p\u003e\n\u003cp\u003e参考文章：\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/h2database/h2database/issues/485\"\u003ehttps://github.com/h2database/h2database/issues/485\u003c/a\u003e\u003c/p\u003e","title":"H2 数据库配置DATABASE_TO_UPPER区分大小写无效"},{"content":"第一次使用时序数据库，本来想用influxdb，搜了下说是国产的TDengine 性能更好，sql和原生差不多，所以就想尝试下，但学到现在一路的坑啊\u0026hellip;\u0026hellip;\n这里我使用的是TDengine Docker版，安装命令\n1 docker run -d -v /etc/taos:/etc/taos -p 6030:6030 -p 6035:6035 -p 6041:6041 -p 6030-6040:6030-6040/udp tdengine/tdengine:2.0.0.0 注意版本号，默认账户密码为：root/taosdata\n常见问题 1、 java.sql.SQLException: TDengine Error: Invalid timestamp 如果本地时区要和服务端一样\n解答：https://github.com/taosdata/TDengine/issues/4345#\n2、本地驱动版本、maven TDengine 版本、服务端版本 要一致 3、本地开发需要设置TDengine驱动环境变量 1 -Djava.library.path=C:\\TDengine\\driver 4、TDengine Error: Unable to resolve FQDN 这个居然还要保持主机名一致\u0026hellip;\u0026hellip;.也就是要设置host\n，docker版服务端也要在docker里设置，但官网提供的docker创建命令并未配置环境变量。\n","permalink":"https://blog.curlc.com/archives/863/","summary":"\u003cp\u003e第一次使用时序数据库，本来想用influxdb，搜了下说是国产的TDengine 性能更好，sql和原生差不多，所以就想尝试下，但学到现在一路的坑啊\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e这里我使用的是TDengine Docker版，安装命令\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run -d -v /etc/taos:/etc/taos -p 6030:6030 -p 6035:6035 -p 6041:6041 -p 6030-6040:6030-6040/udp tdengine/tdengine:2.0.0.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e注意版本号\u003c/strong\u003e，默认账户密码为：root/taosdata\u003c/p\u003e\n\u003ch2 id=\"常见问题\"\u003e常见问题\u003c/h2\u003e\n\u003ch2 id=\"1-javasqlsqlexception-tdengine-error-invalid-timestamp\"\u003e1、 java.sql.SQLException: TDengine Error: Invalid timestamp \u003c/h2\u003e\n\u003cp\u003e如果本地时区要和服务端一样\u003c/p\u003e\n\u003cp\u003e解答：https://github.com/taosdata/TDengine/issues/4345#\u003c/p\u003e\n\u003ch2 id=\"2本地驱动版本maven-tdengine-版本服务端版本-要一致\"\u003e2、本地驱动版本、maven TDengine  版本、服务端版本 要一致\u003c/h2\u003e\n\u003ch2 id=\"3本地开发需要设置tdengine驱动环境变量\"\u003e3、本地开发需要设置TDengine驱动环境变量\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-Djava.library.path=C:\\TDengine\\driver\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/03/11/image8956d5d4a4db08ba.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"4tdengine-error-unable-to-resolve-fqdn\"\u003e4、TDengine Error: Unable to resolve FQDN\u003c/h2\u003e\n\u003cp\u003e这个居然还要保持主机名一致\u0026hellip;\u0026hellip;.也就是要设置host\u003c/p\u003e\n\u003cp\u003e，docker版服务端也要在docker里设置，但官网提供的docker创建命令并未配置环境变量。\u003c/p\u003e","title":"关于TDengine使用上一些注意事项(坑) - 未完"},{"content":"此篇文章仅作为个人笔记，由于初学难免有理解错误的地方，请大佬指正~\n由于我这个部分没有使用SpringBoot，使用的是RabbitMq java Client API 所以在Springboot上的有些功能用不了，只能手动实现，故在思维上走了一个坑。\n测试代码： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 public static void main(String[] args) { //连接工厂 ConnectionFactory factory = new ConnectionFactory(); // factory.useNio(); // factory.setNioParams(new NioParams().setNbIoThreads(4)); factory.setHost(\u0026#34;xxx.xxx.xxx.xxx\u0026#34;); factory.setPort(port); factory.setUsername(\u0026#34;username\u0026#34;); factory.setPassword(\u0026#34;password\u0026#34;); factory.setVirtualHost(\u0026#34;msgpush\u0026#34;); // f.setConnectionTimeout(5000); // f.setHandshakeTimeout(3000); ExecutorService service = Executors.newFixedThreadPool(30); factory.setSharedExecutor(service); // 设置自动恢复 factory.setAutomaticRecoveryEnabled(true); factory.setNetworkRecoveryInterval(2); factory.setTopologyRecoveryEnabled(true);// 设置不重新声明交换器，队列等信息。 System.out.println(\u0026#34;检索请求的最大频道数:\u0026#34; + factory.getRequestedChannelMax()); // f.setRequestedChannelMax(10); try { // Channel channel = f.newConnection().createChannel(); //建立连接 Connection c = factory.newConnection(\u0026#34;push Client\u0026#34;); c.addShutdownListener(new ShutdownListener() { @Override public void shutdownCompleted(ShutdownSignalException e) { System.out.println( \u0026#34;断线了......\u0026#34;); } }); //建立信道 Channel ch = c.createChannel(); //声明队列,如果该队列已经创建过,则不会重复创建 //ch.queueDeclare(\u0026#34;QueueWX\u0026#34;, false, false, false, null); System.out.println(\u0026#34;等待接收数据\u0026#34;); // 单条消息的大小限制，一般设为0或不设置，不限制大小 int prefecthSize = 0; // 告诉RabbitMQ不要同时给消费端推送n条消息，一旦有n个消息还没ack，则该consumer将block掉，直到有ack；注意在自动应答下不生效 int prefecthCount = 5; // 表示是否应用于channel上，即是channel级别还是consumer级别 boolean global = true; ch.basicQos(3); //消费者取消时的回调对象1 CancelCallback cancelHandel = new CancelCallback() { @Override public void handle(String consumerTag) throws IOException { System.out.println(consumerTag + \u0026#34; 链接已断开\u0026#34;); } }; /*微信*/ DeliverImpl deliverWx = new DeliverImpl(ch, MQEnum.QUEUE_WX); ch.basicConsume(MQEnum.QUEUE_WX.getData(), false, deliverWx, cancelHandel); /*企业微信*/ DeliverImpl deliver = new DeliverImpl(ch, MQEnum.QUEUE_WORKWX); //第二个参数为消息回执，消息确认处理完成，为true为自动确认，只要消息发送到消费者即消息处理成功;为false为，手动发送确认回执，服务器才认为这个消息处理成功 ch.basicConsume(MQEnum.QUEUE_WORKWX.getData(), false, deliver, cancelHandel); /*钉钉*/ DeliverImpl deliverDing = new DeliverImpl(ch, MQEnum.QUEUE_DINGDING); ch.basicConsume(MQEnum.QUEUE_DINGDING.getData(), false, deliverDing, cancelHandel); /*tg*/ DeliverImpl deliverTg = new DeliverImpl(ch, MQEnum.QUEUE_TG); ch.basicConsume(MQEnum.QUEUE_TG.getData(), false, deliverTg, cancelHandel); } catch (IOException e) { e.printStackTrace(); } catch (TimeoutException e) { e.printStackTrace(); } } Deliver实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class DeliverImpl implements DeliverCallback { private static final Gson gson; private Channel ch; private MQEnum mqEnum; public DeliverImpl(Channel ch, MQEnum mqEnum) { this.ch = ch; this.mqEnum = mqEnum; } static { gson = new Gson(); } @Override public void handle(String s, Delivery message) throws IOException { // try { String msg = new String(message.getBody(), \u0026#34;UTF-8\u0026#34;); // System.out.println(\u0026#34;收到消息:\u0026#34; + msg); log.info(\u0026#34;收到消息: {}\u0026#34;, msg); // MqMessageDispatcher.doDispatch(msg, message, ch); } } 问题分析 上面的代码是我看了其他文章和官方文档复制过来的，发现一个问题，无论服务端中有多少消息，也会单条的执行，虽然这就是队列的作用，但是这样效率就上不去了，研究了段时间后在官方文档中发现：\nChannel thread-safety in Java Client API Guide:\nChannel instances are safe for use by multiple threads. Requests into a Channel are serialized, with only one thread being able to run a command on the Channel at a time. Even so, applications should prefer using a Channel per thread instead of sharing the same Channel across multiple threads.\n通道实例可安全用于多个线程。进入Channel的请求被序列化，一次只能有一个线程在Channel上运行命令。即使这样，应用程序应该更喜欢每个线程使用一个Channel，而不是在多个线程之间共享同一个Channel。\n也就是说创建的Channel只会在一个一个线程里运行，这就说明以上代码中每次只会执行一次的问题，即使设置的 **ch.basicQos(3); **所以可以看出\n1 2 3 4 5 6 7 8 9 10 11 12 13 /*微信*/ DeliverImpl deliverWx = new DeliverImpl(ch, MQEnum.QUEUE_WX); ch.basicConsume(MQEnum.QUEUE_WX.getData(), false, deliverWx, cancelHandel); /*企业微信*/ DeliverImpl deliver = new DeliverImpl(ch, MQEnum.QUEUE_WORKWX); //第二个参数为消息回执，消息确认处理完成，为true为自动确认，只要消息发送到消费者即消息处理成功;为false为，手动发送确认回执，服务器才认为这个消息处理成功 ch.basicConsume(MQEnum.QUEUE_WORKWX.getData(), false, deliver, cancelHandel); /*钉钉*/ DeliverImpl deliverDing = new DeliverImpl(ch, MQEnum.QUEUE_DINGDING); ch.basicConsume(MQEnum.QUEUE_DINGDING.getData(), false, deliverDing, cancelHandel); /*tg*/ DeliverImpl deliverTg = new DeliverImpl(ch, MQEnum.QUEUE_TG); ch.basicConsume(MQEnum.QUEUE_TG.getData(), false, deliverTg, cancelHandel); 解决方法 这里的代码，我还将多个Deliver绑定到一个Channel上，后果就是5个队列共享一个Channel，虽然每次拉取3条消息，但处理消息还是单线程(阻塞)，造成消息堆积。\n按照官方文档 通道和并发注意事项（线程安全） 这种写法会导致某些操作却不能并发调用，这将导致导线上的帧交错不正确，两次确认。\n每个线程使用一个Channel，而不是在多个线程之间共享同一Channel。\n这里改为\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //建立信道 Channel ch_wx = c.createChannel(); Channel ch_workwx = c.createChannel(); Channel ch_dingding = c.createChannel(); Channel ch_tg = c.createChannel(); Channel ch_email = c.createChannel(); /*微信*/ DeliverImpl deliverWx = new DeliverImpl(ch_wx, MQEnum.QUEUE_WX); ch_wx.basicConsume(MQEnum.QUEUE_WX.getData(), false, deliverWx, cancelHandel); /*企业微信*/ DeliverImpl deliver = new DeliverImpl(ch_workwx, MQEnum.QUEUE_WORKWX); //第二个参数为消息回执，消息确认处理完成，为true为自动确认，只要消息发送到消费者即消息处理成功;为false为，手动发送确认回执，服务器才认为这个消息处理成功 ch_workwx.basicConsume(MQEnum.QUEUE_WORKWX.getData(), false, deliver, cancelHandel); /*钉钉*/ DeliverImpl deliverDing = new DeliverImpl(ch_dingding, MQEnum.QUEUE_DINGDING); ch_dingding.basicConsume(MQEnum.QUEUE_DINGDING.getData(), false, deliverDing, cancelHandel); /*tg*/ DeliverImpl deliverTg = new DeliverImpl(ch_tg, MQEnum.QUEUE_TG); ch_tg.basicConsume(MQEnum.QUEUE_TG.getData(), false, deliverTg, cancelHandel); 每个Channel 对应一个链接。\n说到这里 需要理解这几个注意点：\nConnection： Connection表示到消息代理的真实TCP连接， Channel：是其中的虚拟连接（AMQP连接）。这样，您可以在应用程序内部使用任意数量的（虚拟）连接，而不会使TCP连接使代理过载。\n您可以Channel为所有内容使用一个。但是，如果您有多个线程，建议Channel对每个线程使用不同的线程。 每个Consumer线程都在从使用者线程池分配的自己的线程中运行。如果多个使用者订阅了同一队列，则代理将使用循环机制在它们之间平均分配消息。请参阅教程二：“工作队列”。\n使用线程池处理队列 这样可以将拉取到的消息并行处理，也就是所谓的并发。\n1 2 // 将Deliver类中这行取消注释 MqMessageDispatcher.doDispatch(msg, message, ch); 任务线程池： 这里仅打印，使用延迟模拟业务耗时\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 public class MqMessageDispatcher { public static ExecutorService msgHandleService = Executors.newFixedThreadPool(30); static { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { msgHandleService.shutdown(); } }); } public static void doDispatch(String s, Delivery message,Channel ch) { msgHandleService.execute(new MessageHandleTask(s, message, ch)); } private static class MessageHandleTask implements Runnable { String s; Delivery message; Channel ch; public MessageHandleTask(String s, Delivery message, Channel ch) { this.s = s; this.message = message; this.ch = ch; } @Override public void run() { try { long start = System.currentTimeMillis(); String tName = Thread.currentThread().getName(); System.out.println(tName + \u0026#34; [x] Received \u0026#39;\u0026#34; + s + \u0026#34;\u0026#39;\u0026#34;); try { int randNumber = new Random().nextInt(5000 - 1000 + 1) + 1000; Thread.sleep(randNumber); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println(tName + \u0026#34; cost \u0026#34; + (end - start)); ch.basicAck(message.getEnvelope().getDeliveryTag(), false); } catch (IOException e) { e.printStackTrace(); } } } } 未完： 参考文章：\nRabbitMQ以及通道和连接之间的关系 通道和并发注意事项（线程安全）\nRabbitMQ多线程消费消息\n","permalink":"https://blog.curlc.com/archives/853/","summary":"\u003cp\u003e此篇文章仅作为个人笔记，由于初学难免有理解错误的地方，请大佬指正~\u003c/p\u003e\n\u003cp\u003e由于我这个部分没有使用SpringBoot，使用的是RabbitMq java Client API 所以在Springboot上的有些功能用不了，只能手动实现，故在思维上走了一个坑。\u003c/p\u003e\n\u003ch2 id=\"测试代码\"\u003e测试代码：\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e69\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"o\"\u003e[]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e//连接工厂  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eConnectionFactory\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eConnectionFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//        factory.useNio();  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//        factory.setNioParams(new NioParams().setNbIoThreads(4));  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetHost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;xxx.xxx.xxx.xxx\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetPort\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eport\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetUsername\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;username\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetPassword\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;password\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetVirtualHost\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;msgpush\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//        f.setConnectionTimeout(5000);  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//        f.setHandshakeTimeout(3000);  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eExecutorService\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eservice\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eExecutors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003enewFixedThreadPool\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e30\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetSharedExecutor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eservice\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 设置自动恢复  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetAutomaticRecoveryEnabled\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetNetworkRecoveryInterval\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetTopologyRecoveryEnabled\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 设置不重新声明交换器，队列等信息。  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;检索请求的最大频道数:\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetRequestedChannelMax\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//        f.setRequestedChannelMax(10);  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003etry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e//            Channel channel = f.newConnection().createChannel();  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e//建立连接  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eConnection\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003enewConnection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;push Client\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eaddShutdownListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eShutdownListener\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nd\"\u003e@Override\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eshutdownCompleted\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eShutdownSignalException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;断线了......\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e//建立信道  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eChannel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ecreateChannel\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e//声明队列,如果该队列已经创建过,则不会重复创建  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e//ch.queueDeclare(\u0026#34;QueueWX\u0026#34;, false, false, false, null);  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;等待接收数据\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 单条消息的大小限制，一般设为0或不设置，不限制大小  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eprefecthSize\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 告诉RabbitMQ不要同时给消费端推送n条消息，一旦有n个消息还没ack，则该consumer将block掉，直到有ack；注意在自动应答下不生效  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eprefecthCount\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003e5\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 表示是否应用于channel上，即是channel级别还是consumer级别  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"kt\"\u003eboolean\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eglobal\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ebasicQos\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e//消费者取消时的回调对象1  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eCancelCallback\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecancelHandel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eCancelCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nd\"\u003e@Override\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eString\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econsumerTag\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eIOException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eout\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econsumerTag\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;  链接已断开\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"cm\"\u003e/*微信*/\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eDeliverImpl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edeliverWx\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDeliverImpl\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMQEnum\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eQUEUE_WX\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ebasicConsume\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMQEnum\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eQUEUE_WX\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetData\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edeliverWx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecancelHandel\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"cm\"\u003e/*企业微信*/\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eDeliverImpl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edeliver\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDeliverImpl\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMQEnum\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eQUEUE_WORKWX\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"c1\"\u003e//第二个参数为消息回执，消息确认处理完成，为true为自动确认，只要消息发送到消费者即消息处理成功;为false为，手动发送确认回执，服务器才认为这个消息处理成功  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ebasicConsume\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMQEnum\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eQUEUE_WORKWX\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetData\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edeliver\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecancelHandel\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"cm\"\u003e/*钉钉*/\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eDeliverImpl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edeliverDing\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDeliverImpl\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMQEnum\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eQUEUE_DINGDING\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ebasicConsume\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMQEnum\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eQUEUE_DINGDING\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetData\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edeliverDing\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecancelHandel\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"cm\"\u003e/*tg*/\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003eDeliverImpl\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edeliverTg\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eDeliverImpl\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMQEnum\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eQUEUE_TG\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ech\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ebasicConsume\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMQEnum\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eQUEUE_TG\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetData\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edeliverTg\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecancelHandel\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIOException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eTimeoutException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eprintStackTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \u003c/p\u003e","title":"RabbitMQ Java Client 并发问题思考(一)"},{"content":"众所周知，noCaptcha 的验证接口和css是被屏蔽的，所以可以使用 recaptcha.net 这个google在国内的域名。想着有轮子绝不撸代码的想法，试了几款插件，找到一款对代码修改最小的插件(或者直接不用修改，我目前使用的这款主题需要手动修改)。\n1、安装插件 https://cn.wordpress.org/plugins/advanced-nocaptcha-recaptcha/\n2、启用并设置插件 注册 recaptcha 秘钥。https://www.google.com/recaptcha/admin/\n3、修改主题代码(可选) 同理，如果评论的时候没有进行验证，提交没有显示错误信息，那么只需要对提交评论的 g-recaptcha-response 字段就行判断一下就可以了。\n每款主题的输错错误方式不一样，所以自己修改~\n同时还需要添加验证代码\n1 2 anr_verify_captcha() 成功时返回值为true，否则为false。 ","permalink":"https://blog.curlc.com/archives/831/","summary":"\u003cp\u003e众所周知，noCaptcha 的验证接口和css是被屏蔽的，所以可以使用 recaptcha.net 这个google在国内的域名。想着有轮子绝不撸代码的想法，试了几款插件，找到一款对代码修改最小的插件(或者直接不用修改，我目前使用的这款主题需要手动修改)。\u003c/p\u003e\n\u003ch2 id=\"1安装插件\"\u003e  1、安装插件\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://cn.wordpress.org/plugins/advanced-nocaptcha-recaptcha/\"\u003ehttps://cn.wordpress.org/plugins/advanced-nocaptcha-recaptcha/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/03/01/576-chrome_yFVaX3SnDo5b51f5c3dea25e85.md.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"2启用并设置插件\"\u003e2、启用并设置插件\u003c/h2\u003e\n\u003cp\u003e注册 recaptcha 秘钥。\u003ca href=\"https://www.google.com/recaptcha/admin/\"\u003ehttps://www.google.com/recaptcha/admin/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/03/01/KxwG9cyJBbd57c6a6823092ced.png\"\u003e\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/03/01/yU0yNqx9612510046445b502cf.md.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/03/01/image0241afb19b95aff0.png\"\u003e\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch2 id=\"3修改主题代码可选\"\u003e3、修改主题代码(可选)\u003c/h2\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/03/01/image167e565efe297a56.png\"\u003e\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e同理，如果评论的时候没有进行验证，提交没有显示错误信息，那么只需要对提交评论的 g-recaptcha-response 字段就行判断一下就可以了。\u003c/p\u003e\n\u003cp\u003e每款主题的输错错误方式不一样，所以自己修改~\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/03/01/imaged254a45e3a766dab.png\"\u003e\u003c/p\u003e\n\u003cp\u003e同时还需要添加验证代码\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eanr_verify_captcha()  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e成功时返回值为true，否则为false。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"国内WordPress启用谷歌验证码(noCaptcha )"},{"content":"使用的技术：\nSpring Boot 2.3.2 Java Mail 1.6.2 Maven 3 Java 8 1、添加依赖 1 spring-boot-starter-mail 1 2 3 4 5 \u0026lt;!-- send email --\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;org.springframework.boot\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;spring-boot-starter-mail\u0026lt;/artifactId\u0026gt; \u0026lt;/dependency\u0026gt; 2、配置 application.properties 这里得注意下了，除了邮件服务商说明同时支持tls或者ssl，否则需要将tls/ssl分开配置\n,这里我使用得是outlook，所以只支持 tls 587端口，一开始我配置成ssl，走了一个坑。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 spring.mail.host=smtp.gmail.com spring.mail.port=587 spring.mail.username=username spring.mail.password=password # Other properties spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.connectiontimeout=5000 spring.mail.properties.mail.smtp.timeout=5000 spring.mail.properties.mail.smtp.writetimeout=5000 # 这里是tls的配置项，如果没有使用587，则要注释掉 # TLS , port 587 spring.mail.properties.mail.smtp.starttls.enable=true # 这里是ssl的配置项，如果没有使用465，则要注释掉 # SSL, post 465 #spring.mail.properties.mail.smtp.socketFactory.port = 465 #spring.mail.properties.mail.smtp.socketFactory.class = javax.net.ssl.SSLSocketFactory 1 2 3 4 5 6 7 8 如果是这个错误，那么就是你把tls/ssl的配置弄反了。 nested exception is: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: smtp.office365.com, port: 587; nested exception is: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?; message exceptions (1) are: Failed message 1: javax.mail.MessagingException: Could not connect to SMTP host: smtp.office365.com, port: 587; nested exception is: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?] with root cause 3、发送文本邮件 1 2 3 4 5 6 7 8 9 10 11 import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; @Autowired private JavaMailSender javaMailSender; void sendEmail() { SimpleMailMessage msg = new SimpleMailMessage(); msg.setTo(\u0026#34;to_1@gmail.com\u0026#34;, \u0026#34;to_2@gmail.com\u0026#34;, \u0026#34;to_3@yahoo.com\u0026#34;); msg.setSubject(\u0026#34;Testing from Spring Boot\u0026#34;); msg.setText(\u0026#34;Hello World \\n Spring Boot Email\u0026#34;); javaMailSender.send(msg); } 4、发送html格式的邮件 1 2 3 4 5 6 7 8 9 10 @GetMapping(\u0026#34;sendMail\u0026#34;) void sendMain() throws MessagingException { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true); message.setFrom(\u0026#34;浅忆博客(系统)\u0026lt;server@curlc.com\u0026gt;\u0026#34;); message.setTo(\u0026#34;xxxxx@qq.com\u0026#34;); message.setSubject(\u0026#34;HTML邮件\u0026#34;); message.setText(\u0026#34;\u0026lt;h1\u0026gt;Check attachment for image!\u0026lt;/h1\u0026gt;\u0026#34;, true); mailSender.send(mimeMessage); } 5、发送HTML电子邮件和文件附件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import org.springframework.core.io.ClassPathResource; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; void sendEmailWithAttachment() throws MessagingException, IOException { MimeMessage msg = javaMailSender.createMimeMessage(); // true = multipart message MimeMessageHelper helper = new MimeMessageHelper(msg, true); helper.setTo(\u0026#34;to_@email\u0026#34;); helper.setSubject(\u0026#34;Testing from Spring Boot\u0026#34;); // default = text/plain //helper.setText(\u0026#34;Check attachment for image!\u0026#34;); // true = text/html helper.setText(\u0026#34;\u0026lt;h1\u0026gt;Check attachment for image!\u0026lt;/h1\u0026gt;\u0026#34;, true); // hard coded a file path //FileSystemResource file = new FileSystemResource(new File(\u0026#34;path/android.png\u0026#34;)); helper.addAttachment(\u0026#34;my_photo.png\u0026#34;, new ClassPathResource(\u0026#34;android.png\u0026#34;)); javaMailSender.send(msg); } 参考文章:\nhttps://mkyong.com/spring-boot/spring-boot-how-to-send-email-via-smtp/\n","permalink":"https://blog.curlc.com/archives/818/","summary":"\u003cp\u003e使用的技术：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSpring Boot 2.3.2\u003c/li\u003e\n\u003cli\u003eJava Mail 1.6.2\u003c/li\u003e\n\u003cli\u003eMaven 3\u003c/li\u003e\n\u003cli\u003eJava 8\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"1添加依赖\"\u003e1、添加依赖\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003espring-boot-starter-mail\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e\u0026lt;!-- send email --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;groupId\u0026gt;\u003c/span\u003eorg.springframework.boot\u003cspan class=\"nt\"\u003e\u0026lt;/groupId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026lt;artifactId\u0026gt;\u003c/span\u003espring-boot-starter-mail\u003cspan class=\"nt\"\u003e\u0026lt;/artifactId\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/dependency\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"2配置-applicationproperties\"\u003e2、配置 application.properties\u003c/h2\u003e\n\u003cp\u003e这里得注意下了，除了邮件服务商说明同时支持tls或者ssl，否则需要将tls/ssl分开配置\u003c/p\u003e\n\u003cp\u003e,这里我使用得是outlook，所以只支持 tls 587端口，一开始我配置成ssl，走了一个坑。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yml\" data-lang=\"yml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.mail.host=smtp.gmail.com  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.mail.port=587  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.mail.username=username  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.mail.password=password\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# Other properties\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.mail.properties.mail.smtp.auth=true\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.mail.properties.mail.smtp.connectiontimeout=5000  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.mail.properties.mail.smtp.timeout=5000  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.mail.properties.mail.smtp.writetimeout=5000  \u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# 这里是tls的配置项，如果没有使用587，则要注释掉\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# TLS , port 587\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.mail.properties.mail.smtp.starttls.enable=true\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# 这里是ssl的配置项，如果没有使用465，则要注释掉\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# SSL, post 465\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#spring.mail.properties.mail.smtp.socketFactory.port = 465\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#spring.mail.properties.mail.smtp.socketFactory.class = javax.net.ssl.SSLSocketFactory\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e如果是这个错误，那么就是你把tls/ssl的配置弄反了。  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enested exception is:  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tjavax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: smtp.office365.com, port: 587;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  nested exception is:  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tjavax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?; message exceptions (1) are:  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFailed message 1: javax.mail.MessagingException: Could not connect to SMTP host: smtp.office365.com, port: 587;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  nested exception is:  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tjavax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?] with root cause\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"3发送文本邮件\"\u003e3、发送文本邮件\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003eorg.springframework.mail.SimpleMailMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003eorg.springframework.mail.javamail.JavaMailSender\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nd\"\u003e@Autowired\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eJavaMailSender\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ejavaMailSender\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003esendEmail\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eSimpleMailMessage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eSimpleMailMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;to_1@gmail.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;to_2@gmail.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;to_3@yahoo.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetSubject\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Testing from Spring Boot\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Hello World \\n Spring Boot Email\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ejavaMailSender\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"4发送html格式的邮件\"\u003e4、发送html格式的邮件\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nd\"\u003e@GetMapping\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;sendMail\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003esendMain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMessagingException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eMimeMessage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emimeMessage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emailSender\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ecreateMimeMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eMimeMessageHelper\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMimeMessageHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emimeMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;浅忆博客(系统)\u0026lt;server@curlc.com\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;xxxxx@qq.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetSubject\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;HTML邮件\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt;h1\u0026gt;Check attachment for image!\u0026lt;/h1\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003emailSender\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emimeMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"5发送html电子邮件和文件附件\"\u003e5、发送HTML电子邮件和文件附件\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003eorg.springframework.core.io.ClassPathResource\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003eorg.springframework.mail.javamail.JavaMailSender\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003eorg.springframework.mail.javamail.MimeMessageHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ejavax.mail.MessagingException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nn\"\u003ejavax.mail.internet.MimeMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003esendEmailWithAttachment\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003ethrows\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMessagingException\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eIOException\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eMimeMessage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ejavaMailSender\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003ecreateMimeMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// true = multipart message\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eMimeMessageHelper\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ehelper\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eMimeMessageHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ehelper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;to_@email\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ehelper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetSubject\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Testing from Spring Boot\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// default = text/plain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e//helper.setText(\u0026#34;Check attachment for image!\u0026#34;);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// true = text/html\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ehelper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt;h1\u0026gt;Check attachment for image!\u0026lt;/h1\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e// hard coded a file path\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"c1\"\u003e//FileSystemResource file = new FileSystemResource(new File(\u0026#34;path/android.png\u0026#34;));\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ehelper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003eaddAttachment\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;my_photo.png\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eClassPathResource\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;android.png\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ejavaMailSender\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emsg\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/02/17/image348ad2b0f08a124e.png\"\u003e\u003c/p\u003e","title":"Spring Boot 通过SMTP发送电子邮件(ssl/tls)"},{"content":"背景 自从贵州在搞大数据后，大概在18年还是17年底，贵州电信就回收了所有的家庭公网ip，当时我家里宽带的也被回收了，刚了2天，贵州电信一直把这个责任推给办宽带的营业厅和安装师傅，我所在的地区欠发达，人家安装师傅和营业厅工作人员也不知道怎么弄，一直好言好语给我打了好几次电话，最后成功拿到公网IP最关键的一句话是“以前我的宽带都有公网IP”，我就让安装师傅就把问题再反馈到上一级，后面机房的人给我打电话说弄好了，重启光猫后确实有公网了(中间有变成内网过1次，又是刚了2天)。\n2021-02-16 我在贵阳又办了一根千兆的宽带，可笑的是千兆上传还是30Mbps(这30Mbps还是当年工信部强制出了个文件，才开始从20Mbps升级到30Mbps)，光猫也不给万兆或者2.5G光猫，速度也不达标(白天还好，能跑930Mbps，晚上高峰期就只有650Mbps了)，公网ip？更别想了，客服回复永远只有这几句话\n目前暂未提供IP地址更改服务\n目前我公司提供的IP地址多数都是100开头的，只要您能正常登录QQ、访问网站，即表示宽带网络正常。同时IP地址是我公司宽带接入服务器动态分配的，暂未提供IP地址更改服务。\n所以现在是bt下载没速度，NAS不能玩，为了所谓的大数据把ip资源给某些公司，不得已去华为云买了台贵阳地区5Mpbs 的vps做内网穿透，把摄像头和NAS映射出去，延迟倒是和内网一样，但是5Mbps的上传能做啥，卡的一批。不过有点欣慰的是可能也知道回收公网IP 搞得大家都不高兴，IPV6推进倒是蛮快得，电信和联通都分配了/60 的ipv6(手机数据也给了)，但现在v6的路由瞎跳，开了反而影响正常上网，哎\u0026hellip;\u0026hellip;\n2021-2-20 09:30： 昨天投诉后，10000号回访，说ip资源有限，无法给新用户公网ip，老用户可以ip回退，说到要工信部投诉，回复是“这是您的权益”，看来真的挺刚的\u0026hellip;\u0026hellip;\n中间我打4008810000投诉过当地电信，然而更牛，直接说这是业务问题，请打10000号，然后直接挂了，这个投诉电话也是摆设？emm\u0026hellip;\u0026hellip;???要是有用我打这个投诉电话做啥？？？我投诉当地电信居然说这是业务问题，又推给10000号？真的把我气笑了。\n然而又能怎么办呢，只能将就用ipv6了,不过对这贵州电信真的是一生黑，过段时间携号转网了\u0026hellip;\u0026hellip;\n附图 这里借用这个链接的图片，我问的回答也是一样的\nhttps://zhidao.baidu.com/question/1772589045169142300.html\n收集关于贵州电信公网IP的链接:\nhttps://tieba.baidu.com/p/6112677755\n","permalink":"https://blog.curlc.com/archives/809/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e自从贵州在搞大数据后，大概在18年还是17年底，贵州电信就回收了所有的家庭公网ip，当时我家里宽带的也被回收了，刚了2天，贵州电信一直把这个责任推给办宽带的营业厅和安装师傅，我所在的地区欠发达，人家安装师傅和营业厅工作人员也不知道怎么弄，一直好言好语给我打了好几次电话，最后成功拿到公网IP最关键的一句话是“以前我的宽带都有公网IP”，我就让安装师傅就把问题再反馈到上一级，后面机房的人给我打电话说弄好了，重启光猫后确实有公网了(中间有变成内网过1次，又是刚了2天)。\u003c/p\u003e\n\u003ch3 id=\"2021-02-16\"\u003e2021-02-16\u003c/h3\u003e\n\u003cp\u003e我在贵阳又办了一根千兆的宽带，可笑的是千兆上传还是30Mbps(这30Mbps还是当年工信部强制出了个文件，才开始从20Mbps升级到30Mbps)，光猫也不给万兆或者2.5G光猫，速度也不达标(白天还好，能跑930Mbps，晚上高峰期就只有650Mbps了)，公网ip？更别想了，客服回复永远只有这几句话\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e目前暂未提供IP地址更改服务\u003cbr\u003e\n目前我公司提供的IP地址多数都是100开头的，只要您能正常登录QQ、访问网站，即表示宽带网络正常。同时IP地址是我公司宽带接入服务器动态分配的，暂未提供IP地址更改服务。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e所以现在是bt下载没速度，NAS不能玩，为了所谓的大数据把ip资源给某些公司，不得已去华为云买了台贵阳地区5Mpbs 的vps做内网穿透，把摄像头和NAS映射出去，延迟倒是和内网一样，但是5Mbps的上传能做啥，卡的一批。不过有点欣慰的是可能也知道回收公网IP 搞得大家都不高兴，IPV6推进倒是蛮快得，电信和联通都分配了/60 的ipv6(手机数据也给了)，但现在v6的路由瞎跳，开了反而影响正常上网，哎\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003ch3 id=\"2021-2-20-0930\"\u003e2021-2-20 09:30：\u003c/h3\u003e\n\u003cp\u003e昨天投诉后，10000号回访，说ip资源有限，无法给新用户公网ip，老用户可以ip回退，说到要工信部投诉，回复是“这是您的权益”，看来真的挺刚的\u0026hellip;\u0026hellip;\u003cbr\u003e\n中间我打\u003ccode\u003e4008810000\u003c/code\u003e投诉过当地电信，然而更牛，直接说这是业务问题，请打10000号，然后直接挂了，这个投诉电话也是摆设？emm\u0026hellip;\u0026hellip;???要是有用我打这个投诉电话做啥？？？我投诉当地电信居然说这是业务问题，又推给10000号？真的把我气笑了。\u003cbr\u003e\n然而又能怎么办呢，只能将就用ipv6了,不过对这贵州电信真的是一生黑，过段时间携号转网了\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003ch2 id=\"附图\"\u003e附图\u003c/h2\u003e\n\u003cp\u003e这里借用这个链接的图片，我问的回答也是一样的\u003cbr\u003e\n\u003ca href=\"https://zhidao.baidu.com/question/1772589045169142300.html\"\u003ehttps://zhidao.baidu.com/question/1772589045169142300.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/02/16/image369338657c33704a.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/02/16/image69e3c59e0171fb26.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/02/16/imageb076cb18d856727e.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/02/16/lg1yRHuDBGbbb4ae326678daae.gif\"\u003e\u003c/p\u003e\n\u003cp\u003e \u003cbr\u003e\n收集关于贵州电信公网IP的链接:\u003cbr\u003e\n\u003ca href=\"https://tieba.baidu.com/p/6112677755\"\u003ehttps://tieba.baidu.com/p/6112677755\u003c/a\u003e\u003c/p\u003e","title":"吐槽下贵州电信宽带公网IP问题"},{"content":"将lvm转换为qcow2\n1 qemu-img convert -O qcow2 -c /dev/mapper/pve-vm--103--disk--1 13103.qcow2 将备份后的vma转为qcow2(备份时选择不压缩，得到vma文件，再解压，再转换为qcow2，文件比较大)\n1 2 3 4 vma extract vzdump-qemu-100-2019_01_31-13_11_02.vma temp/ qemu-img convert -f raw temp/disk-drive-scsi0.raw -O qcow2 myvm-disk1.qcow2 #如果需要esxi导入则需要加水-o参数 qemu-img convert -f raw temp/disk-drive-ide0.raw -o adapter_type=lsilogic,subformat=streamOptimized,compat6 -O vmdk 100.vmdk 直通\n1 qm set 100 -sata0 /dev/disk/by-id/ata-Colorful_xxxxxxxxxxxxxxxxxxx ","permalink":"https://blog.curlc.com/archives/798/","summary":"\u003cp\u003e将lvm转换为qcow2\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eqemu-img convert -O qcow2 -c /dev/mapper/pve-vm--103--disk--1 13103.qcow2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e将备份后的vma转为qcow2(备份时选择不压缩，得到vma文件，再解压，再转换为qcow2，文件比较大)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evma extract vzdump-qemu-100-2019_01_31-13_11_02.vma temp/  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eqemu-img convert -f raw temp/disk-drive-scsi0.raw -O qcow2 myvm-disk1.qcow2  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#如果需要esxi导入则需要加水-o参数  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eqemu-img convert -f raw temp/disk-drive-ide0.raw -o \u003cspan class=\"nv\"\u003eadapter_type\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003elsilogic,subformat\u003cspan class=\"o\"\u003e=\u003c/span\u003estreamOptimized,compat6 -O vmdk 100.vmdk\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e直通\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eqm \u003cspan class=\"nb\"\u003eset\u003c/span\u003e \u003cspan class=\"m\"\u003e100\u003c/span\u003e -sata0 /dev/disk/by-id/ata-Colorful_xxxxxxxxxxxxxxxxxxx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"PVE 常用命令"},{"content":"前几天IKOULA 5折活动就上了这款机器，12.99欧的样子，蛮不错的~\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ---------------------------------------------------------------------- CPU Model : Intel(R) Xeon(R) CPU E31220 [url=home.php?mod=space\u0026amp;uid=175]@[/url] 3.10GHz CPU Cores : 4 CPU Frequency : 2530.147 MHz CPU Cache : 8192 KB Total Disk : 3687.4 GB (3.0 GB Used) Total Mem : 7946 MB (836 MB Used) Total Swap : 1023 MB (0 MB Used) System uptime : 0 days, 0 hour 2 min Load average : 0.44, 0.25, 0.10 OS : Debian GNU/Linux 9 Arch : x86_64 (64 Bit) Kernel : 4.15.18-30-pve TCP CC : cubic Virtualization : Dedicated Organization : AS21409 Ikoula Net SAS Location : Paris / FR Region : Île-de-France ---------------------------------------------------------------------- I/O Speed(1st run) : 179 MB/s I/O Speed(2nd run) : 177 MB/s I/O Speed(3rd run) : 173 MB/s Average I/O speed : 176.3 MB/s ---------------------------------------------------------------------- Node Name Upload Speed Download Speed Latency Speedtest.net 939.86 Mbps 940.75 Mbps 3.06 ms Beijing CU 413.42 Mbps 659.80 Mbps 222.46 ms Shanghai CT 0.51 Mbps 450.41 Mbps 211.26 ms Guangzhou CT 2.32 Mbps 13.37 Mbps 227.53 ms Guangzhou CU 0.28 Mbps 255.96 Mbps 300.72 ms Shenzhen CU 0.53 Mbps 856.65 Mbps 191.32 ms Hongkong CN 372.65 Mbps 906.42 Mbps 193.00 ms Singapore SG 0.94 Mbps 748.87 Mbps 249.70 ms Tokyo JP 101.93 Mbps 2.91 Mbps 215.84 ms --------------------------------------------------------------------- 硬盘是新的~\n","permalink":"https://blog.curlc.com/archives/797/","summary":"\u003cp\u003e前几天IKOULA  5折活动就上了这款机器，12.99欧的样子，蛮不错的~\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU Model             : Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E31220 \u003cspan class=\"o\"\u003e[\u003c/span\u003e\u003cspan class=\"nv\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehome.php?mod\u003cspan class=\"o\"\u003e=\u003c/span\u003espace\u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nv\"\u003euid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e175\u003cspan class=\"o\"\u003e]\u003c/span\u003e@\u003cspan class=\"o\"\u003e[\u003c/span\u003e/url\u003cspan class=\"o\"\u003e]\u003c/span\u003e 3.10GHz  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU Cores             : \u003cspan class=\"m\"\u003e4\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU Frequency         : 2530.147 MHz  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU Cache             : \u003cspan class=\"m\"\u003e8192\u003c/span\u003e KB  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTotal Disk            : 3687.4 GB \u003cspan class=\"o\"\u003e(\u003c/span\u003e3.0 GB Used\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTotal Mem             : \u003cspan class=\"m\"\u003e7946\u003c/span\u003e MB \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e836\u003c/span\u003e MB Used\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTotal Swap            : \u003cspan class=\"m\"\u003e1023\u003c/span\u003e MB \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e MB Used\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem uptime         : \u003cspan class=\"m\"\u003e0\u003c/span\u003e days, \u003cspan class=\"m\"\u003e0\u003c/span\u003e hour \u003cspan class=\"m\"\u003e2\u003c/span\u003e min  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLoad average          : 0.44, 0.25, 0.10  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOS                    : Debian GNU/Linux \u003cspan class=\"m\"\u003e9\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eArch                  : x86_64 \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e64\u003c/span\u003e Bit\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eKernel                : 4.15.18-30-pve  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTCP CC                : cubic  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVirtualization        : Dedicated  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOrganization          : AS21409 Ikoula Net SAS  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLocation              : Paris / FR  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRegion                : Île-de-France  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e1st run\u003cspan class=\"o\"\u003e)\u003c/span\u003e    : \u003cspan class=\"m\"\u003e179\u003c/span\u003e MB/s  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e2nd run\u003cspan class=\"o\"\u003e)\u003c/span\u003e    : \u003cspan class=\"m\"\u003e177\u003c/span\u003e MB/s  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e3rd run\u003cspan class=\"o\"\u003e)\u003c/span\u003e    : \u003cspan class=\"m\"\u003e173\u003c/span\u003e MB/s  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAverage I/O speed     : 176.3 MB/s  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNode Name        Upload Speed      Download Speed      Latency  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSpeedtest.net    939.86 Mbps       940.75 Mbps         3.06 ms  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBeijing    CU    413.42 Mbps       659.80 Mbps         222.46 ms  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShanghai   CT    0.51 Mbps         450.41 Mbps         211.26 ms  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGuangzhou  CT    2.32 Mbps         13.37 Mbps          227.53 ms  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGuangzhou  CU    0.28 Mbps         255.96 Mbps         300.72 ms  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShenzhen   CU    0.53 Mbps         856.65 Mbps         191.32 ms  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHongkong   CN    372.65 Mbps       906.42 Mbps         193.00 ms  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSingapore  SG    0.94 Mbps         748.87 Mbps         249.70 ms  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTokyo      JP    101.93 Mbps       2.91 Mbps           215.84 ms  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e硬盘是新的~\u003c/p\u003e","title":"IKOULA C-StorageII 5折机器"},{"content":"背景 前几天由于云筏那里把我的域名从cf处删除后，导致解析全部回源，ssl证书异常!\n后来用了ion的cfp版本，但是ssl一直处于 待颁发(错误) 状态，将鼠标移到三角感叹号出发现报错 caa error: xxx.x\n这才想起申请let’s 通配符证书时加了CAA记录\n1 0 issue \u0026#34;letsencrypt.org\u0026#34; 解决方法 所以这里有2种处理方法\n将 let’s 的caa 记录删掉 或者将cf的证书颁发机构也加入CAA 0 issue \u0026ldquo;digicert.com\u0026rdquo; CAA:允许域所有者指示允许哪些CA为其颁发证书。\n所以加了let’s 的CAA记录就会导致其他的CA颁发证书失败，这个时候就需要将带颁发的CA加入CAA。\n","permalink":"https://blog.curlc.com/archives/783/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e前几天由于云筏那里把我的域名从cf处删除后，导致解析全部回源，ssl证书异常!\u003cbr\u003e\n后来用了ion的cfp版本，但是ssl一直处于 \u003cstrong\u003e待颁发(错误)\u003c/strong\u003e 状态，将鼠标移到三角感叹号出发现报错 \u003cstrong\u003ecaa error: xxx.x\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/2021/01/04/17abfac26e1a3.png\"\u003e\u003c/p\u003e\n\u003cp\u003e这才想起申请let’s 通配符证书时加了CAA记录\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e0 issue \u0026#34;letsencrypt.org\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"解决方法\"\u003e解决方法\u003c/h2\u003e\n\u003cp\u003e所以这里有2种处理方法\u003cbr\u003e\n \u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e将 let’s 的caa 记录删掉\u003c/li\u003e\n\u003cli\u003e或者将cf的证书颁发机构也加入CAA\n0 issue \u0026ldquo;digicert.com\u0026rdquo;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/2021/01/06/6cab9c9b86ca1.png\"\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCAA:允许域所有者指示允许哪些CA为其颁发证书。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e所以加了let’s 的CAA记录就会导致其他的CA颁发证书失败，这个时候就需要将带颁发的CA加入CAA。\u003c/p\u003e","title":"cloudflare(cf) ssl 无法部署的一个问题"},{"content":"老早就想知道了，问了论坛没啥回应，今天就去翻了下sys的tos，其中 https://www.soyoustart.com/ie/termsofservice/version/Special_Conditions_for_So_You_Start_Dedicated_Server_2013-12-05.pdf 第七条就是关于邮件的，机翻如下\n1 2 3 4 5 6 7 8 9 10 11 12 13 第7条：防止供应商网络发送垃圾邮件的措施供应商应实施技术措施体系，以防止从其基础设施中发送欺诈性电子邮件和垃圾邮件。 供应商应监视从服务器到互联网上端口25（SMTP服务器）的传出流量，这应包括通过自动工具监视流量。 供应商不得对流出的流量进行过滤或拦截，而应延迟几秒钟。 这些操作应由供应商在服务器和互联网之间并行进行。 对已发送的电子邮件不执行任何操作。 供应商不得对电子邮件进行任何标记，也不得以任何方式修改客户发送的电子邮件。 在供应商进行这些操作期间，除统计数据外，不得存储任何信息。 该操作应由供应商定期且以全自动方式进行，并且客户确认在监视端口25（SMTP端口）的流量期间不涉及人工干预。 如果来自客户服务器的外发流量（包括电子邮件）被识别为垃圾邮件或欺诈性电子邮件，则供应商应通过电子邮件通知客户并阻止服务器的SMTP端口。 即使服务器被识别为垃圾邮件，供应商也不应保留从服务器SMTP端口发送的电子邮件的任何副本。 客户必须通过“开始使用技术协助”请求解除SMTP端口的阻塞。 任何被识别为垃圾邮件的新电子邮件都将导致供应商较长时间重新封锁SMTP端口，具体取决于供应商的合理判断。 如果发生供应商第三次阻塞SMTP端口的情况，则供应商保留拒绝取消SMTP端口的任何新请求的权利。 大概意思是可以做邮件服务器，但是不得发送垃圾邮件，ovh不会保存邮件副本也不会标记，但是如果被程序识别到垃圾邮件会封禁25端口，需要工单解封，超过3次则永久关闭25端口。\n","permalink":"https://blog.curlc.com/archives/775/","summary":"\u003cp\u003e老早就想知道了，问了论坛没啥回应，今天就去翻了下sys的tos，其中\n\u003ca href=\"https://www.soyoustart.com/ie/termsofservice/version/Special_Conditions_for_So_You_Start_Dedicated_Server_2013-12-05.pdf\"\u003ehttps://www.soyoustart.com/ie/termsofservice/version/Special_Conditions_for_So_You_Start_Dedicated_Server_2013-12-05.pdf\u003c/a\u003e\n第七条就是关于邮件的，机翻如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e第7条：防止供应商网络发送垃圾邮件的措施供应商应实施技术措施体系，以防止从其基础设施中发送欺诈性电子邮件和垃圾邮件。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e供应商应监视从服务器到互联网上端口25（SMTP服务器）的传出流量，这应包括通过自动工具监视流量。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e供应商不得对流出的流量进行过滤或拦截，而应延迟几秒钟。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e这些操作应由供应商在服务器和互联网之间并行进行。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e对已发送的电子邮件不执行任何操作。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e供应商不得对电子邮件进行任何标记，也不得以任何方式修改客户发送的电子邮件。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e在供应商进行这些操作期间，除统计数据外，不得存储任何信息。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e该操作应由供应商定期且以全自动方式进行，并且客户确认在监视端口25（SMTP端口）的流量期间不涉及人工干预。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e如果来自客户服务器的外发流量（包括电子邮件）被识别为垃圾邮件或欺诈性电子邮件，则供应商应通过电子邮件通知客户并阻止服务器的SMTP端口。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e即使服务器被识别为垃圾邮件，供应商也不应保留从服务器SMTP端口发送的电子邮件的任何副本。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e客户必须通过“开始使用技术协助”请求解除SMTP端口的阻塞。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e任何被识别为垃圾邮件的新电子邮件都将导致供应商较长时间重新封锁SMTP端口，具体取决于供应商的合理判断。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e如果发生供应商第三次阻塞SMTP端口的情况，则供应商保留拒绝取消SMTP端口的任何新请求的权利。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e大概意思是可以做邮件服务器，但是不得发送垃圾邮件，ovh不会保存邮件副本也不会标记，但是如果被程序识别到垃圾邮件会封禁25端口，需要工单解封，超过3次则永久关闭25端口。\u003c/p\u003e","title":"关于OVH或SYS(soyoustart)能不能做邮件服务器问题"},{"content":"初步学习Angular9，在httpclient模块栽了半天。根据官方文档设置ur居然是无效的，比如\n1 2 let httpParams = new HttpParams().set(\u0026#39;code\u0026#39;, \u0026#39;aaaa\u0026#39;);//可以成功设置code httpParams.set(\u0026#39;state\u0026#39;, \u0026#39;ccccc\u0026#39;); // 无法设置state 看了stackoverflow的回答后才知道\nHttpParams旨在是不可变的。该set和append方法不修改现有的实例。相反，它们返回新实例并应用更改。\n所以这里有两种方案:\n1、使用 fromString 变量从查询字符串中直接创建 HTTP 参数 1 2 3 4 5 const data = { code: this.subInfo.code, state: this.subInfo.state }; const httpParams = new HttpParams({fromObject: data}); 2、直接传递对象而不是HttpParams 1 http.get(url, {params: data}) 所以直接是用方法2了~\n参考文章:\nhttps://stackoverflow.com/questions/45210406/angular-4-3-httpclient-set-params\n","permalink":"https://blog.curlc.com/archives/773/","summary":"\u003cp\u003e初步学习Angular9，在httpclient模块栽了半天。根据官方文档设置ur居然是无效的，比如\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    let httpParams = new HttpParams().set(\u0026#39;code\u0026#39;, \u0026#39;aaaa\u0026#39;);//可以成功设置code  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    httpParams.set(\u0026#39;state\u0026#39;, \u0026#39;ccccc\u0026#39;); // 无法设置state\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e看了stackoverflow的回答后才知道\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHttpParams旨在是不可变的。该set和append方法不修改现有的实例。相反，它们返回新实例并应用更改。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e所以这里有两种方案:\u003c/p\u003e\n\u003ch4 id=\"1使用-fromstring-变量从查询字符串中直接创建-http-参数\"\u003e1、使用 fromString 变量从查询字符串中直接创建 HTTP 参数\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003edata\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esubInfo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esubInfo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e};\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003ehttpParams\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eHttpParams\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003efromObject\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \u003c/p\u003e\n\u003ch4 id=\"2直接传递对象而不是httpparams\"\u003e2、直接传递对象而不是HttpParams\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttp.get(url, {params: data})\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/2020/12/09/ea45a11babe78.png\"\u003e\u003c/p\u003e\n\u003cp\u003e所以直接是用方法2了~\u003c/p\u003e\n\u003cp\u003e参考文章:\u003cbr\u003e\n\u003ca href=\"https://stackoverflow.com/questions/45210406/angular-4-3-httpclient-set-params\"\u003ehttps://stackoverflow.com/questions/45210406/angular-4-3-httpclient-set-params\u003c/a\u003e\u003c/p\u003e","title":"Angular9 HttpClient设置参数无效问题"},{"content":" 最近在学es，需要导入8亿条数据\n手上有一个txt大约有8亿条数据的样子，文件有19G左右，一开始百度搜了下，基本都是重复文章，不过也根据写这些文章的大佬慢慢google到了一些方法。\n先说下导入机器配置:\ncpu: E5 1620V2\n内存: 32G(分给es 12G)\n硬盘:4x2T raid 0(io大概在600左右)\n导入的几种方法: 1、bulk: ES本地支持的批量导入方式，将json文件post到es进行处理。\n将需要导入的数据先生成json文件，格式类似这种\n1 2 3 4 5 6 7 8 9 #指定 index {\u0026#34;index\u0026#34;:{\u0026#34;_index\u0026#34;:\u0026#34;suoy\u0026#34;,\u0026#34;_id\u0026#34;:1}} #字段 {\u0026#34;text_entry\u0026#34;:\u0026#34;内容\u0026#34;} {\u0026#34;index\u0026#34;:{\u0026#34;_index\u0026#34;:\u0026#34;suoy\u0026#34;,\u0026#34;_id\u0026#34;:1}} {\u0026#34;text_entry\u0026#34;:\u0026#34;内容\u0026#34;} {\u0026#34;index\u0026#34;:{\u0026#34;_index\u0026#34;:\u0026#34;suoy\u0026#34;,\u0026#34;_id\u0026#34;:1}} {\u0026#34;text_entry\u0026#34;:\u0026#34;内容\u0026#34;} ........... 然后使用curl提交\n1 curl -H \u0026#39;Content-Type: application/x-ndjson\u0026#39; -XPOST \u0026#39;127.0.0.1:9200/xxxxxxxx/doc/_bulk?pretty\u0026#39; --data-binary @out.json 一开始我是尝试这种方法，用python将数据重新处理了下，生成的文件有48GB\u0026hellip;\u0026hellip;，还花了3-5个小时的样子，导入的时候直接失败~后面，看了下说是文件大小尽量不能超过200MB???这样的话就要分割文件了，虽然可以shell脚本一个一个的提交小文件json，后面想想直接放弃了（嫌麻烦）\u0026hellip;\u0026hellip;.\n2、logstash： ES官方的另一个产品，将数据文本转换为ES的数据源。\n我的文本一行只有两个字段，用 \u0026ldquo;\u0026mdash;-\u0026rdquo; 分割，花了点时间学logstash直接上手开干，但是导入速度只有9000条/s的样子，一个小时导了大概3200w条数据，导了16个小时大概导了5.2亿条数据，这速度完全不行啊，后面手贱不注意按了 Ctrl+c，嗯\u0026hellip;..这下好了，不知道怎么断点续传，又得重新来\u0026hellip;\u0026hellip;\n我用的脚本如下，有懂的大佬能否告知下logstash有没有类似BulkProcessor储存到x条数据再执行Bulk的方法?\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 input { # 从文件读取日志信息 file { path =\u0026gt; \u0026#34;/data/sda3/k/log.txt\u0026#34; type =\u0026gt; \u0026#34;text\u0026#34; start_position =\u0026gt; \u0026#34;beginning\u0026#34; } } filter { mutate { split =\u0026gt; [\u0026#34;message\u0026#34;, \u0026#34;----\u0026#34;] } if [message][2] { mutate { add_field =\u0026gt; { \u0026#34;title\u0026#34; =\u0026gt; \u0026#34;%{[message][1]}\u0026#34; \u0026#34;log\u0026#34; =\u0026gt; \u0026#34;%{[message][2]}\u0026#34; } } }else{ if [message][0] { mutate { add_field =\u0026gt; { \u0026#34;title\u0026#34; =\u0026gt; \u0026#34;%{[message][0]}\u0026#34; } } } if [message][1] { mutate { add_field =\u0026gt; { \u0026#34;log\u0026#34; =\u0026gt; \u0026#34;%{[message][1]}\u0026#34; } } } } } output { elasticsearch{ hosts =\u0026gt; \u0026#34;127.0.0.1:9200\u0026#34; index =\u0026gt; \u0026#34;logs\u0026#34; user =\u0026gt; \u0026#34;elastic\u0026#34; #password =\u0026gt; \u0026#34;xxx\u0026#34; #document_type =\u0026gt; \u0026#34;_doc\u0026#34; } # 标准输出 #stdout { codec =\u0026gt; rubydebug } } 3、Bulk Processor rest方式采用的是restClient，基于http协议，Bulk Processor使用的是TransportClient，基于Tcp协议。\n我这里是将数据jaon序列化后再提交的\n配置文件\n1 2 3 4 5 6 7 8 9 10 11 12 13 cluster.name=my-application ip=10.0.2.26 port=9300 # 每x个请求执行一次Bulk setBulkActions=10 # 每5MB Bulk setBulkSize=5 #无论请求多少，我都希望每x秒刷新一次* setFlushInterval=10 # 设置并发请求数 setConcurrentRequests=5 index=logs path=D:\\\\log.txt Maven\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 org.elasticsearch.client transport 7.1.0 org.apache.logging.log4j log4j-core 2.11.1 com.lmax disruptor 3.4.1 com.google.code.gson gson 2.8.5 org.elasticsearch elasticsearch 7.1.0 org.elasticsearch.client elasticsearch-rest-client 7.1.0 org.elasticsearch.client elasticsearch-rest-high-level-client 7.1.0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 public static void init(String filepath) throws IOException, InterruptedException { // https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-bulk-processor.html /*cluster.name 必须与服务端相同*/ Settings settings = Settings.builder().put(\u0026#34;cluster.name\u0026#34;, \u0026#34;my-application\u0026#34;).build(); // final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); // credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(\u0026#34;elastic\u0026#34;, \u0026#34;12346\u0026#34;)); //es账号密码（默认用户名为elastic） TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new TransportAddress(InetAddress.getByName(properties.getProperty(\u0026#34;ip\u0026#34;)), Integer.valueOf(properties.getProperty(\u0026#34;port\u0026#34;)))); BulkProcessor build = BulkProcessor.builder(client, new BulkProcessor.Listener() { @Override public void beforeBulk(long l, BulkRequest bulkRequest) { /*在批量执行之前调用此方法*/ logger.info(\u0026#34;---尝试插入{}条数据---\u0026#34;, bulkRequest.numberOfActions()); } @Override public void afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) { /*批量执行后调用此方法。例如，您可以检查是否有一些失败的请求response.hasFailures()*/ logger.info(\u0026#34;---插入完成-\u0026gt; {}条数据,---\u0026#34;, bulkRequest.numberOfActions()); bulkResponse.hasFailures(); } @Override public void afterBulk(long l, BulkRequest bulkRequest, Throwable throwable) { /*批量失败并引发一个 Throwable*/ logger.error(\u0026#34;error：\u0026#34; + throwable.getMessage() + \u0026#34; \\ncause：\u0026#34; + throwable.getCause()); // logger.info(\u0026#34;---尝试插入{}条数据---\u0026#34;, bulkRequest.numberOfActions()); } }) /*每x个请求执行一次Bulk*/ .setBulkActions(Integer.valueOf(properties.getProperty(\u0026#34;setBulkActions\u0026#34;))) /*每5MB Bulk一次*/ .setBulkSize(new ByteSizeValue(Integer.valueOf(properties.getProperty(\u0026#34;setBulkSize\u0026#34;)), ByteSizeUnit.MB)) /*无论请求多少，我都希望每5秒刷新一次*/ .setFlushInterval(TimeValue.timeValueSeconds(Integer.valueOf(properties.getProperty(\u0026#34;setFlushInterval\u0026#34;)))) /*设置并发请求数。值为0表示仅允许执行一个请求。值为1表示允许在累积新的批量请求时执行1个并发请求。*/ .setConcurrentRequests(Integer.valueOf(properties.getProperty(\u0026#34;setConcurrentRequests\u0026#34;))) /*设置一个自定义退避策略，该策略最初将等待100毫秒，然后呈指数增长，然后重试最多3次。每当一个或多个批量项目请求失败时，都会尝试重试，EsRejectedExecutionException 并显示，表明有太多的计算资源可用于处理请求。要禁用退避，请通过BackoffPolicy.noBackoff()*/ .setBackoffPolicy( BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3) ).build(); /*默认情况下BulkProcessor： 将bulkActions设置为 1000 设置bulkSize为 5mb 没有设置flushInterval 将parallelRequests设置为1，这意味着异步执行刷新操作。 将backoffPolicy设置为具有8次重试和50ms启动延迟的指数补偿。总等待时间约为5.1秒。 */ String index = properties.getProperty(\u0026#34;index\u0026#34;); logger.info(\u0026#34;开始添加数据!\u0026#34;); Gson gson = new Gson(); // 读取日志文件 File file = new File(filepath); BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file)); BufferedReader reader = new BufferedReader(new InputStreamReader(fis, \u0026#34;utf-8\u0026#34;), 10 * 1024 * 1024);// 用10M的缓冲读取文本文件 String line = \u0026#34;\u0026#34;; while ((line = reader.readLine()) != null) { //TODO: write your business Map\u0026lt;String, String\u0026gt; map = new HashMap\u0026lt;\u0026gt;(); /*第一种情况*/ String[] split = line.split(\u0026#34;----\u0026#34;); if (split.length \u0026gt; 1) { map.put(\u0026#34;qq\u0026#34;, split[1]); map.put(\u0026#34;phone\u0026#34;, split[2]); } if (map.size() \u0026gt; 0) { /*添加数据*/ build.add(new IndexRequest(index, \u0026#34;_doc\u0026#34;).source(gson.toJson(map), XContentType.JSON)); } } logger.info(\u0026#34;添加数据完成!等待提交......\u0026#34;); /*刷新剩余请求*/ //build.flush(); build.awaitClose(10, TimeUnit.MINUTES); // build.close(); 我设置的BulkActions值为 50000 用这种方式导入速度达到了 6w/s的速度，cpu也是全部跑满，完全将性能发挥出来了~\n参考文章:\nhttps://www.cnblogs.com/ttzsqwq/p/11077574.html\nhttps://blog.csdn.net/wslyk606/article/details/79413980\n","permalink":"https://blog.curlc.com/archives/771/","summary":"\u003cblockquote\u003e\n\u003cp\u003e最近在学es，需要导入8亿条数据\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e手上有一个txt大约有8亿条数据的样子，文件有19G左右，一开始百度搜了下，基本都是重复文章，不过也根据写这些文章的大佬慢慢google到了一些方法。\u003cbr\u003e\n先说下导入机器配置:\u003cbr\u003e\ncpu: E5 1620V2\u003cbr\u003e\n内存: 32G(分给es 12G)\u003cbr\u003e\n硬盘:4x2T raid 0(io大概在600左右)\u003c/p\u003e\n\u003ch1 id=\"导入的几种方法\"\u003e导入的几种方法:\u003c/h1\u003e\n\u003ch2 id=\"1bulk\"\u003e1、bulk:\u003c/h2\u003e\n\u003cp\u003eES本地支持的批量导入方式，将json文件post到es进行处理。\u003cbr\u003e\n将需要导入的数据先生成json文件，格式类似这种\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#指定 index  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\u0026#34;index\u0026#34;:{\u0026#34;_index\u0026#34;:\u0026#34;suoy\u0026#34;,\u0026#34;_id\u0026#34;:1}}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#字段  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\u0026#34;text_entry\u0026#34;:\u0026#34;内容\u0026#34;}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\u0026#34;index\u0026#34;:{\u0026#34;_index\u0026#34;:\u0026#34;suoy\u0026#34;,\u0026#34;_id\u0026#34;:1}}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\u0026#34;text_entry\u0026#34;:\u0026#34;内容\u0026#34;}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\u0026#34;index\u0026#34;:{\u0026#34;_index\u0026#34;:\u0026#34;suoy\u0026#34;,\u0026#34;_id\u0026#34;:1}}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\u0026#34;text_entry\u0026#34;:\u0026#34;内容\u0026#34;}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e...........\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e然后使用curl提交\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -H \u0026#39;Content-Type: application/x-ndjson\u0026#39; -XPOST \u0026#39;127.0.0.1:9200/xxxxxxxx/doc/_bulk?pretty\u0026#39; --data-binary @out.json\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e一开始我是尝试这种方法，用python将数据重新处理了下，生成的文件有48GB\u0026hellip;\u0026hellip;，还花了3-5个小时的样子，导入的时候直接失败~后面，看了下说是文件大小尽量不能超过200MB???这样的话就要分割文件了，虽然可以shell脚本一个一个的提交小文件json，后面想想直接放弃了（嫌麻烦）\u0026hellip;\u0026hellip;.\u003c/p\u003e\n\u003ch2 id=\"2logstash\"\u003e2、logstash：\u003c/h2\u003e\n\u003cp\u003eES官方的另一个产品，将数据文本转换为ES的数据源。\u003cbr\u003e\n我的文本一行只有两个字段，用 \u0026ldquo;\u0026mdash;-\u0026rdquo; 分割，花了点时间学logstash直接上手开干，但是导入速度只有9000条/s的样子，一个小时导了大概3200w条数据，导了16个小时大概导了5.2亿条数据，这速度完全不行啊，后面手贱不注意按了 Ctrl+c，嗯\u0026hellip;..这下好了，不知道怎么断点续传，又得重新来\u0026hellip;\u0026hellip;\u003cbr\u003e\n我用的脚本如下，有懂的大佬能否告知下logstash有没有类似BulkProcessor储存到x条数据再执行Bulk的方法?\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einput {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    # 从文件读取日志信息  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    file {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        path =\u0026gt; \u0026#34;/data/sda3/k/log.txt\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        type =\u0026gt; \u0026#34;text\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        start_position =\u0026gt; \u0026#34;beginning\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efilter {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    mutate {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        split =\u0026gt; [\u0026#34;message\u0026#34;, \u0026#34;----\u0026#34;]  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tif [message][2] {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        mutate {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            add_field =\u0026gt;   {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u0026#34;title\u0026#34; =\u0026gt; \u0026#34;%{[message][1]}\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u0026#34;log\u0026#34; =\u0026gt; \u0026#34;%{[message][2]}\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            }  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }else{  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\tif [message][0] {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        mutate {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            add_field =\u0026gt;   {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u0026#34;title\u0026#34; =\u0026gt; \u0026#34;%{[message][0]}\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            }  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\tif [message][1] {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\tmutate {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\tadd_field =\u0026gt;   {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\u0026#34;log\u0026#34; =\u0026gt; \u0026#34;%{[message][1]}\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eoutput {  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\telasticsearch{  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\thosts =\u0026gt; \u0026#34;127.0.0.1:9200\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\tindex =\u0026gt; \u0026#34;logs\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\tuser =\u0026gt; \u0026#34;elastic\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t#password  =\u0026gt; \u0026#34;xxx\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t#document_type =\u0026gt; \u0026#34;_doc\u0026#34;  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t}  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    # 标准输出  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    #stdout { codec =\u0026gt; rubydebug }  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \u003c/p\u003e","title":"elasticsearch 使用BulkProcessor导入txt大文件"},{"content":"其实安装完pve后第一步就是移除企业订阅源，防止后面出现很多问题(由于企业仓库更新源需要购买订阅服务，所以我们需要手动修改到官方的非订阅源)。\n由于proxmox VE 的 ifupdown2 到企业版里了，所以\u0026hellip;\u0026hellip;\n删除原来的企业源 1 rm /etc/apt/sources.list.d/pve-enterprise.list 添加官方非订阅免费源 1 echo \u0026#39;deb http://download.proxmox.com/debian/pve buster pve-no-subscription\u0026#39; \u0026gt;\u0026gt; /etc/apt/sources.list.d/pve-no-subscription.list 注意上边的buster，非其他教程中的stretch，是由于debian版本的问题，具体不解释\n更新 1 apt update 安装ifupdown2 1 apt install ifupdown2 参考文章:\nhttps://www.d3tt.com/view/119\n","permalink":"https://blog.curlc.com/archives/761/","summary":"\u003cp\u003e其实安装完pve后第一步就是移除企业订阅源，防止后面出现很多问题(由于企业仓库更新源需要购买订阅服务，所以我们需要手动修改到官方的非订阅源)。\u003cbr\u003e\n由于proxmox VE 的 ifupdown2 到企业版里了，所以\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003ch2\u003e\u003c/h2\u003e\n\u003ch2 id=\"删除原来的企业源\"\u003e删除原来的企业源\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm /etc/apt/sources.list.d/pve-enterprise.list\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"添加官方非订阅免费源\"\u003e添加官方非订阅免费源\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;deb http://download.proxmox.com/debian/pve buster pve-no-subscription\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eetc\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eapt\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esources\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elist\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003epve\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eno\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esubscription\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e注意上边的buster，非其他教程中的stretch，是由于debian版本的问题，具体不解释\u003c/p\u003e\n\u003ch2 id=\"更新\"\u003e更新\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt update\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"安装ifupdown2\"\u003e安装ifupdown2\u003c/h2\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt install ifupdown2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e参考文章:\u003cbr\u003e\n\u003ca href=\"https://www.d3tt.com/view/119\"\u003ehttps://www.d3tt.com/view/119\u003c/a\u003e\u003c/p\u003e","title":"pve 安装ifupdown2"},{"content":" 1 2 3 4 5 6 7 8 org.springframework.jdbc.BadSqlGrammarException: ###Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExceptin: Table ‘xxx.xxx’ doesn’t exist ###The error may exist in com/example/mapper/UserMapper.java (best guess) ###The error may involve defaultParameterMap ###The error occurred while setting parameters ###SQL: SELECT id,name,age,email FROM user ###Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘xxx.xxxr’ doesn’t exist ; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘xxx.xxx’ doesn’t exist 错误原因：原因实体类pojo名字和表名不一致！！mybatis-plus默认规则是实体类和表名以驼峰命名法映射，要求是需要符合这个规则才能执行成功。\n所以需要在实体类上加@TableName(“表名”)\n由于我使用的是官方的代码生成器，所以有这么一句\n1 strategy.setTablePrefix(pc.getModuleName() + \u0026#34;_\u0026#34;); 在输入模块名的时候我输入的是 aaa.bbb.ccc这种格式，刚好和表名对应上，所以这里默认把aaa.bbb去掉了,刚好默认实体又没@TableName注解，导致找不到表名。\n我在代码生成器中加入\n1 2 /*强制生成TableName,TableId,TableFiled 注解*/ strategy.setEntityTableFieldAnnotationEnable(true); 即可生成TableName,TableId,TableFiled 注解(需要 3.2.1版本以上)。\n1 2 3 4 5 6 \u0026lt;!--Mybatis plus代码生成器--\u0026gt; \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;com.baomidou\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;mybatis-plus-generator\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;3.4.0\u0026lt;/version\u0026gt; \u0026lt;/dependency\u0026gt; 1 2 3 4 5 \u0026lt;dependency\u0026gt; \u0026lt;groupId\u0026gt;com.baomidou\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;mybatis-plus-boot-starter\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;3.4.0\u0026lt;/version\u0026gt; \u0026lt;/dependency\u0026gt; 参考文章:\nhttps://blog.csdn.net/xtho62/article/details/107385514\nhttps://github.com/baomidou/mybatis-plus/issues/1910\nhttps://gitee.com/baomidou/mybatis-plus/issues/IM3XE\n","permalink":"https://blog.curlc.com/archives/754/","summary":"\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eorg.springframework.jdbc.BadSqlGrammarException:  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e###Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExceptin: Table ‘xxx.xxx’ doesn’t exist  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e###The error may exist in com/example/mapper/UserMapper.java (best guess)  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e###The error may involve defaultParameterMap  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e###The error occurred while setting parameters  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e###SQL: SELECT id,name,age,email FROM user  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e###Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘xxx.xxxr’ doesn’t exist  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘xxx.xxx’ doesn’t exist\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e错误原因：原因实体类pojo名字和表名不一致！！mybatis-plus默认规则是实体类和表名以驼峰命名法映射，要求是需要符合这个规则才能执行成功。\u003cbr\u003e\n所以需要在实体类上加@TableName(“表名”)\u003cbr\u003e\n由于我使用的是官方的代码生成器，所以有这么一句\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003estrategy\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003esetTablePrefix\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003epc\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"na\"\u003egetModuleName\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;_\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e在输入模块名的时候我输入的是 aaa.bbb.ccc这种格式，刚好和表名对应上，所以这里默认把aaa.bbb去掉了,刚好默认实体又没@TableName注解，导致找不到表名。\u003cbr\u003e\n \u003cbr\u003e\n我在代码生成器中加入\u003c/p\u003e","title":"踩坑 mybatis-plus Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table "},{"content":"FILEPATH 变量代表的是路径。\n1 2 3 4 5 6 7 8 git filter-branch --force --index-filter \u0026#39;git rm --cached --ignore-unmatch FILEPATH\u0026#39; --prune-empty --tag-name-filter cat -- --all # 例子 git filter-branch --force --index-filter \u0026#39;git rm --cached --ignore-unmatch src/main/resources/application-dev.properties\u0026#39; --prune-empty --tag-name-filter cat -- --all git push origin master --force rm -rf .git/refs/original/ git reflog expire --expire=now --all git gc --prune=now git gc --aggressive --prune=now ","permalink":"https://blog.curlc.com/archives/749/","summary":"\u003cp\u003e\u003ccode\u003eFILEPATH\u003c/code\u003e 变量代表的是路径。\u003cbr\u003e\n \u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit filter-branch --force --index-filter \u0026#39;git rm --cached --ignore-unmatch FILEPATH\u0026#39; --prune-empty --tag-name-filter cat -- --all  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 例子  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit filter-branch --force --index-filter \u0026#39;git rm --cached --ignore-unmatch src/main/resources/application-dev.properties\u0026#39; --prune-empty --tag-name-filter cat -- --all  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit push origin master --force  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm -rf .git/refs/original/  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit reflog expire --expire=now --all  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit gc --prune=now  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit gc --aggressive --prune=now\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"git(github)删除误上传的敏感文件"},{"content":" 1 qmrestore ubuntu14.04.5-bak.vma.lzo 101 -storage local ","permalink":"https://blog.curlc.com/archives/746/","summary":"\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eqmrestore ubuntu14.04.5-bak.vma.lzo \u003cspan class=\"m\"\u003e101\u003c/span\u003e -storage \u003cspan class=\"nb\"\u003elocal\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"proxmox恢复vm(vma)到指定的存储"},{"content":"注册完E5后可以绑定自己的域名作为邮局，但是只有默认的onmicrosoft.com域开启了DKIM，自己接入的域名并没有开启，所以这里按照官方文档开启DKIM以减少进垃圾邮箱的可能性。\n2021-12-04 更新 有读者反馈 https://security.microsoft.com/dkimv2 网址已经可以直接开启DKIM了，我去试了下，点击开启会自动校验 CNAME 记录，自己复制值在dns那添加就可以了(如果不知道怎么添加，可以看第三步)。\n以下文章仅作记录，直接通过上面的方法开启就可以了。\n1、开启DKIM 首先进入到office365管理面板，点击左侧菜单栏的「全部显示」，然后点击「Exchange」，进入Exchange控制台。\n这里会列出已接入域名，点击域名右侧会显示DKIM的状态，点击启用就好。\n如果第一次接入会显示「没有为此域名保存DKIM签名\n」，根据官方文档，可以通过Powershell方式来开启。\n2、连接到 Exchange Online 这里的操作以管理员权限打开，需要注意的是，所有命令必须在同一个PowerShell下操作\n。\n下面命令中 为自己的域名\n。\n在本地计算机上，打开 Windows PowerShell 并运行以下命令。 1 $UserCredential = Get-Credential 在“Windows PowerShell 凭据请求”对话框中，键入工作或学校帐户用户名和密码，再单击“确定”。 运行以下命令连接到Exchange Online： 1 $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection 注意：\n对于 Office 365 世纪互联运营，请使用 ConnectionUri 值：https://partner.outlook.cn/PowerShell 对于 Office 365 Germany，请使用 ConnectionUri 值：https://outlook.office.de/powershell-liveid/ 对于 Microsoft 365 GCC High，请使用 ConnectionUri 值：https://outlook.office365.us/powershell-liveid/ 对于 Microsoft 365 DoD，请使用 ConnectionUri 值：https://webmail.apps.mil/powershell-liveid 运行以下命令设置会话： 1 Import-PSSession $Session -DisableNameChecking 下面这个命令先不要执行，只是在操作完成后再执行,作用是断开与远程 PowerShell 会话的连接。如果没有断开会话就关闭了 Windows PowerShell 窗口，可能会用完可用的所有远程 PowerShell 会话，并且将需要等待会话过期。\n1 Remove-PSSession $Session 如何知道操作成功？ 执行步骤 3 后，Exchange Online cmdlet 将导入到您的本地 Windows PowerShell 会话，并通过进度条进行跟踪。 如果未收到任何错误，说明连接成功。 一个快速测试是运行 Exchange Online cmdlet（例如 Get-Mailbox），然后查看结果。\n如果收到错误，则查看以下要求：\n常见问题是密码错误。重新运行上述三个步骤，并仔细查看在步骤 1 中输入的用户名和密码。 为了帮助防止受到拒绝服务 (DoS) 攻击，您最多只能打开三次与 Exchange Online 组织的远程 PowerShell 连接。 必须为远程 PowerShell 启用用于连接到 Exchange Online 的帐户。有关详细信息，请参阅启用或禁用对 Exchange Online PowerShell 的访问。 需要在本地计算机和 Microsoft 365 之间打开 TCP 端口 80 通信。 它可能已经打开了，但是要考虑您的组织是否存在严格的 Internet 访问政策。 如果你的组织使用联合身份验证，并且标识提供者 (IDP) 和/或安全令牌服务 (STS) 未公开提供，则无法使用联合帐户连接到 Exchange Online PowerShell。 而是应该在 Microsoft 365 中创建并使用非联合帐户来连接到 Exchange Online PowerShell。 3、在 DNS 中发布自定义域的两条 CNAME 记录 对于需要 DKIM 签名的域，需要发布两条 CNAME 记录。\n运行以下命令以创建选择器目录：\n1 2 3 New-DkimSigningConfig -DomainName \u0026lt;domain\u0026gt; -Enabled $false # 下面这条命令会给出创建cname的值 Get-DkimSigningConfig -Identity \u0026lt;domain\u0026gt; | Format-List Selector1CNAME, Selector2CNAME 我的cname值是\nselector1-curlc-com._domainkey.qyio.onmicrosoft.com\nselector2-curlc-com._domainkey.qyio.onmicrosoft.com\n所以设置的cname是：\n头为 selector1._domainkey 与 selector2._domainkey selector1._domainkey\n\u0026mdash;\u0026ndash;\u0026gt; selector1-curlc-com._domainkey.qyio.onmicrosoft.com\nselector2._domainkey\n\u0026mdash;\u0026ndash;\u0026gt;selector2-curlc-com._domainkey.qyio.onmicrosoft.com\n自己根据shell返回的值进行添加cname记录。\n4、启用 DKIM 签名 1 Set-DkimSigningConfig -Identity \u0026lt;domain\u0026gt; -Enabled $true 如果报错提示\n对于此配置，CNAME 记录不存在。请先发布以下两个 CNAME 记录。\n那么等待10-30分钟，等到记录生效即可。\n这个时候在后台就能看见DKIM 签名:\n已启用状态。\n参考文章：\n使用基本身份验证连接到 Exchange Online PowerShell https://docs.microsoft.com/zh-cn/powershell/exchange/connect-to-exchange-online-powershell?view=exchange-ps\n使用基本身份验证连接到 Exchange Online PowerShell https://docs.microsoft.com/zh-cn/microsoft-365/security/office-365-security/use-dkim-to-validate-outbound-email?view=o365-worldwide#manually-upgrade-your-1024-bit-keys-to-2048-bit-dkim-encryption-keys\nOffice365邮局开启SPF、DKIM与DMARC https://hanada.info/5369.html\n","permalink":"https://blog.curlc.com/archives/739/","summary":"\u003cp\u003e注册完E5后可以绑定自己的域名作为邮局，但是只有默认的onmicrosoft.com域开启了DKIM，自己接入的域名并没有开启，所以这里按照官方文档开启DKIM以减少进垃圾邮箱的可能性。\u003c/p\u003e\n\u003ch2 id=\"2021-12-04-更新\"\u003e2021-12-04 更新\u003c/h2\u003e\n\u003cp\u003e有读者反馈 \u003ca href=\"https://security.microsoft.com/dkimv2\"\u003ehttps://security.microsoft.com/dkimv2\u003c/a\u003e 网址已经可以直接开启DKIM了，我去试了下，点击开启会自动校验 CNAME 记录，自己复制值在dns那添加就可以了(如果不知道怎么添加，可以看第三步)。\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/12/04/image8f84abf995a6a698.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e以下文章仅作记录，直接通过上面的方法开启就可以了。\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"1开启dkim\"\u003e1、开启DKIM\u003c/h3\u003e\n\u003cp\u003e首先进入到office365管理面板，点击左侧菜单栏的「全部显示」，然后点击「Exchange」，进入Exchange控制台。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/08/16/imageb026ebf3ae1ec1a8.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/08/16/image15e3681307e39fbc.png\"\u003e\u003c/p\u003e\n\u003cp\u003e这里会列出已接入域名，点击域名右侧会显示DKIM的状态，点击启用就好。\u003cbr\u003e\n如果第一次接入会显示「没有为此域名保存DKIM签名\u003c/p\u003e\n\u003cp\u003e」，根据官方文档，可以通过Powershell方式来开启。\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"2连接到-exchange-online\"\u003e2、连接到 Exchange Online\u003c/h3\u003e\n\u003cp\u003e这里的操作以管理员权限打开，需要注意的是，所有命令必须在同一个PowerShell下操作\u003c/p\u003e\n\u003cp\u003e。\u003cbr\u003e\n下面命令中 \u003cdomain\u003e\u003c/p\u003e\n\u003cp\u003e为自己的域名\u003c/p\u003e\n\u003cp\u003e。\u003c/p\u003e\n\u003ch4 id=\"在本地计算机上打开-windows-powershell-并运行以下命令\"\u003e在本地计算机上，打开 Windows PowerShell 并运行以下命令。\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$UserCredential = Get-Credential\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e在“\u003cstrong\u003eWindows PowerShell 凭据请求\u003c/strong\u003e”对话框中，键入工作或学校帐户用户名和密码，再单击“\u003cstrong\u003e确定\u003c/strong\u003e”。\n\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/08/16/image937fc3b899a714a5.png\"\u003e\u003c/p\u003e\n\u003ch4 id=\"运行以下命令连接到exchange-online\"\u003e运行以下命令连接到Exchange Online：\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e注意\u003c/strong\u003e：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e对于 Office 365 世纪互联运营，请使用 \u003cem\u003eConnectionUri\u003c/em\u003e 值：\u003ccode\u003ehttps://partner.outlook.cn/PowerShell\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e对于 Office 365 Germany，请使用 \u003cem\u003eConnectionUri\u003c/em\u003e 值：\u003ccode\u003ehttps://outlook.office.de/powershell-liveid/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e对于 Microsoft 365 GCC High，请使用 \u003cem\u003eConnectionUri\u003c/em\u003e 值：\u003ccode\u003ehttps://outlook.office365.us/powershell-liveid/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e对于 Microsoft 365 DoD，请使用 \u003cem\u003eConnectionUri\u003c/em\u003e 值：\u003ccode\u003ehttps://webmail.apps.mil/powershell-liveid\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"运行以下命令设置会话\"\u003e运行以下命令设置会话：\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eImport-PSSession $Session -DisableNameChecking\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/08/16/imagea4c8cc1f0e71b4d4.png\"\u003e\u003c/p\u003e","title":"Office365邮局开启DKIM"},{"content":"如果是自己的域名在反代配置加上这2句就可以了。\n1 2 proxy_ssl_name $host; proxy_ssl_server_name on; 我自己的配置是\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 location / { proxy_pass https://域名; #Proxy Settings proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_ssl_name $host; proxy_ssl_server_name on; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; # proxy_max_temp_file_size 0; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 64k; proxy_buffers 32 32k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 64k; } ","permalink":"https://blog.curlc.com/archives/738/","summary":"\u003cp\u003e如果是自己的域名在反代配置加上这2句就可以了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eproxy_ssl_name\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eproxy_ssl_server_name\u003c/span\u003e \u003cspan class=\"n\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e我自己的配置是\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_pass\u003c/span\u003e \u003cspan class=\"nl\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"c1\"\u003e//域名;  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"cp\"\u003e#Proxy Settings  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_redirect\u003c/span\u003e \u003cspan class=\"n\"\u003eoff\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003eHost\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e  \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eReal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eIP\u003c/span\u003e  \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eremote_addr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e  \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eForwarded\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eFor\u003c/span\u003e  \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproxy_add_x_forwarded_for\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_ssl_name\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_ssl_server_name\u003c/span\u003e \u003cspan class=\"n\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_next_upstream\u003c/span\u003e \u003cspan class=\"n\"\u003eerror\u003c/span\u003e \u003cspan class=\"n\"\u003etimeout\u003c/span\u003e \u003cspan class=\"n\"\u003einvalid_header\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp_500\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp_502\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp_503\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp_504\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"err\"\u003e#\u003c/span\u003e \u003cspan class=\"n\"\u003eproxy_max_temp_file_size\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_connect_timeout\u003c/span\u003e \u003cspan class=\"mi\"\u003e90\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_send_timeout\u003c/span\u003e  \u003cspan class=\"mi\"\u003e90\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_read_timeout\u003c/span\u003e \u003cspan class=\"mi\"\u003e90\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_buffer_size\u003c/span\u003e \u003cspan class=\"mi\"\u003e64\u003c/span\u003e\u003cspan class=\"n\"\u003ek\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_buffers\u003c/span\u003e  \u003cspan class=\"mi\"\u003e32\u003c/span\u003e \u003cspan class=\"mi\"\u003e32\u003c/span\u003e\u003cspan class=\"n\"\u003ek\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_busy_buffers_size\u003c/span\u003e \u003cspan class=\"mi\"\u003e128\u003c/span\u003e\u003cspan class=\"n\"\u003ek\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eproxy_temp_file_write_size\u003c/span\u003e \u003cspan class=\"mi\"\u003e64\u003c/span\u003e\u003cspan class=\"n\"\u003ek\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"nginx反代cloudflare出现502错误问题"},{"content":"新建的虚拟机下同配置跑的分，均开启了host。配置为 8C8G50G。\nESXI6.7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 # # # # # # # ##### ###### # # #### # # # # ## # # # # # # # ## # # # # # # # # # # # ## ##### ##### # # # # ###### # # # # # # ## # # # # # # # # # # # # ## # # # # # # # ## # # # # #### # # # # # ##### ###### # # #### # # Version 5.1.3 Based on the Byte Magazine Unix Benchmark Multi-CPU version Version 5 revisions by Ian Smith, Sunnyvale, CA, USA January 13, 2011 johantheghost at yahoo period com Wide character in print at ./Run line 1511. Wide character in printf at ./Run line 1542. 1 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10 1 x Double-Precision Whetstone 1 2 3 4 5 6 7 8 9 10 1 x Execl Throughput 1 2 3 1 x File Copy 1024 bufsize 2000 maxblocks 1 2 3 1 x File Copy 256 bufsize 500 maxblocks 1 2 3 1 x File Copy 4096 bufsize 8000 maxblocks 1 2 3 1 x Pipe Throughput 1 2 3 4 5 6 7 8 9 10 1 x Pipe-based Context Switching 1 2 3 4 5 6 7 8 9 10 1 x Process Creation 1 2 3 1 x System Call Overhead 1 2 3 4 5 6 7 8 9 10 1 x Shell Scripts (1 concurrent) 1 2 3 1 x Shell Scripts (8 concurrent) 1 2 3 Wide character in printf at ./Run line 1484. 8 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10 8 x Double-Precision Whetstone 1 2 3 4 5 6 7 8 9 10 8 x Execl Throughput 1 2 3 8 x File Copy 1024 bufsize 2000 maxblocks 1 2 3 8 x File Copy 256 bufsize 500 maxblocks 1 2 3 8 x File Copy 4096 bufsize 8000 maxblocks 1 2 3 8 x Pipe Throughput 1 2 3 4 5 6 7 8 9 10 8 x Pipe-based Context Switching 1 2 3 4 5 6 7 8 9 10 8 x Process Creation 1 2 3 8 x System Call Overhead 1 2 3 4 5 6 7 8 9 10 8 x Shell Scripts (1 concurrent) 1 2 3 8 x Shell Scripts (8 concurrent) 1 2 3 Wide character in printf at ./Run line 1484. ======================================================================== BYTE UNIX Benchmarks (Version 5.1.3) System: debian: GNU/Linux OS: GNU/Linux -- 4.19.0-5-amd64 -- #1 SMP Debian 4.19.37-5 (2019-06-19) Machine: x86_64 (unknown) Language: en_US.utf8 (charmap=\u0026#34;ANSI_X3.4-1968\u0026#34;, collate=\u0026#34;ANSI_X3.4-1968\u0026#34;) CPU 0: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 1: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 2: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 3: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 4: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 5: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 6: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 7: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization 01:35:22 up 1:33, 2 users, load average: 3.18, 3.77, 2.12; runlevel ------------------------------------------------------------------------ Benchmark Run: 一 8月 10 2020 01:35:22 - 02:02:31 8 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 37275700.7 lps (10.0 s, 7 samples) Double-Precision Whetstone 5654.1 MWIPS (6.2 s, 7 samples) Execl Throughput 4156.3 lps (30.0 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 697111.7 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 187842.5 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 2194571.2 KBps (30.0 s, 2 samples) Pipe Throughput 985672.0 lps (10.0 s, 7 samples) Pipe-based Context Switching 46277.6 lps (10.0 s, 7 samples) Process Creation 2855.4 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 4167.8 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 1955.7 lpm (60.0 s, 2 samples) System Call Overhead 688554.4 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 37275700.7 3194.1 Double-Precision Whetstone 55.0 5654.1 1028.0 Execl Throughput 43.0 4156.3 966.6 File Copy 1024 bufsize 2000 maxblocks 3960.0 697111.7 1760.4 File Copy 256 bufsize 500 maxblocks 1655.0 187842.5 1135.0 File Copy 4096 bufsize 8000 maxblocks 5800.0 2194571.2 3783.7 Pipe Throughput 12440.0 985672.0 792.3 Pipe-based Context Switching 4000.0 46277.6 115.7 Process Creation 126.0 2855.4 226.6 Shell Scripts (1 concurrent) 42.4 4167.8 983.0 Shell Scripts (8 concurrent) 6.0 1955.7 3259.4 System Call Overhead 15000.0 688554.4 459.0 ======== System Benchmarks Index Score 974.5 ------------------------------------------------------------------------ Benchmark Run: 一 8月 10 2020 02:02:31 - 02:29:45 8 CPUs in system; running 8 parallel copies of tests Dhrystone 2 using register variables 272463301.5 lps (10.0 s, 7 samples) Double-Precision Whetstone 41703.8 MWIPS (6.5 s, 7 samples) Execl Throughput 23978.3 lps (30.0 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 979782.2 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 263271.7 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 3177481.5 KBps (30.0 s, 2 samples) Pipe Throughput 7084002.7 lps (10.0 s, 7 samples) Pipe-based Context Switching 1632492.5 lps (10.0 s, 7 samples) Process Creation 43134.3 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 44920.5 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 6769.3 lpm (60.0 s, 2 samples) System Call Overhead 4393974.7 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 272463301.5 23347.3 Double-Precision Whetstone 55.0 41703.8 7582.5 Execl Throughput 43.0 23978.3 5576.3 File Copy 1024 bufsize 2000 maxblocks 3960.0 979782.2 2474.2 File Copy 256 bufsize 500 maxblocks 1655.0 263271.7 1590.8 File Copy 4096 bufsize 8000 maxblocks 5800.0 3177481.5 5478.4 Pipe Throughput 12440.0 7084002.7 5694.5 Pipe-based Context Switching 4000.0 1632492.5 4081.2 Process Creation 126.0 43134.3 3423.4 Shell Scripts (1 concurrent) 42.4 44920.5 10594.5 Shell Scripts (8 concurrent) 6.0 6769.3 11282.1 System Call Overhead 15000.0 4393974.7 2929.3 ======== System Benchmarks Index Score 5383.8 ======= Script description and score comparison completed! ======= PVE6.2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 make[1]: Leaving directory \u0026#39;/opt/unixbench/UnixBench\u0026#39; locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_MESSAGES to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_MESSAGES to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory sh: 1: 3dinfo: not found sh: 1: runlevel: not found # # # # # # # ##### ###### # # #### # # # # ## # # # # # # # ## # # # # # # # # # # # ## ##### ##### # # # # ###### # # # # # # ## # # # # # # # # # # # # ## # # # # # # # ## # # # # #### # # # # # ##### ###### # # #### # # Version 5.1.3 Based on the Byte Magazine Unix Benchmark Multi-CPU version Version 5 revisions by Ian Smith, Sunnyvale, CA, USA January 13, 2011 johantheghost at yahoo period com Wide character in print at ./Run line 1511. Wide character in printf at ./Run line 1542. 1 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10 1 x Double-Precision Whetstone 1 2 3 4 5 6 7 8 9 10 1 x Execl Throughput 1 2 3 1 x File Copy 1024 bufsize 2000 maxblocks 1 2 3 1 x File Copy 256 bufsize 500 maxblocks 1 2 3 1 x File Copy 4096 bufsize 8000 maxblocks 1 2 3 1 x Pipe Throughput 1 2 3 4 5 6 7 8 9 10 1 x Pipe-based Context Switching 1 2 3 4 5 6 7 8 9 10 1 x Process Creation 1 2 3 1 x System Call Overhead 1 2 3 4 5 6 7 8 9 10 1 x Shell Scripts (1 concurrent) 1 2 3 1 x Shell Scripts (8 concurrent) 1 2 3 Wide character in printf at ./Run line 1484. 8 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10 8 x Double-Precision Whetstone 1 2 3 4 5 6 7 8 9 10 8 x Execl Throughput 1 2 3 8 x File Copy 1024 bufsize 2000 maxblocks 1 2 3 8 x File Copy 256 bufsize 500 maxblocks 1 2 3 8 x File Copy 4096 bufsize 8000 maxblocks 1 2 3 8 x Pipe Throughput 1 2 3 4 5 6 7 8 9 10 8 x Pipe-based Context Switching 1 2 3 4 5 6 7 8 9 10 8 x Process Creation 1 2 3 8 x System Call Overhead 1 2 3 4 5 6 7 8 9 10 8 x Shell Scripts (1 concurrent) 1 2 3 8 x Shell Scripts (8 concurrent) 1 2 3 Wide character in printf at ./Run line 1484. ======================================================================== BYTE UNIX Benchmarks (Version 5.1.3) System: debian: GNU/Linux OS: GNU/Linux -- 4.19.0-5-amd64 -- #1 SMP Debian 4.19.37-5 (2019-06-19) Machine: x86_64 (unknown) Language: en_US.utf8 (charmap=\u0026#34;ANSI_X3.4-1968\u0026#34;, collate=\u0026#34;ANSI_X3.4-1968\u0026#34;) CPU 0: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET CPU 1: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET CPU 2: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET CPU 3: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET CPU 4: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET CPU 5: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET CPU 6: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET CPU 7: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.0 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET 11:14:36 up 3 min, 2 users, load average: 0.57, 0.19, 0.06; runlevel ------------------------------------------------------------------------ Benchmark Run: 二 8月 11 2020 11:14:36 - 11:42:00 8 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 38457773.2 lps (10.0 s, 7 samples) Double-Precision Whetstone 5894.1 MWIPS (7.7 s, 7 samples) Execl Throughput 3653.5 lps (30.0 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 594688.8 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 155116.1 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 2093652.8 KBps (30.0 s, 2 samples) Pipe Throughput 840578.6 lps (10.0 s, 7 samples) Pipe-based Context Switching 69113.8 lps (10.0 s, 7 samples) Process Creation 2092.7 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 3592.3 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 1596.2 lpm (60.0 s, 2 samples) System Call Overhead 661908.8 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 38457773.2 3295.4 Double-Precision Whetstone 55.0 5894.1 1071.7 Execl Throughput 43.0 3653.5 849.6 File Copy 1024 bufsize 2000 maxblocks 3960.0 594688.8 1501.7 File Copy 256 bufsize 500 maxblocks 1655.0 155116.1 937.3 File Copy 4096 bufsize 8000 maxblocks 5800.0 2093652.8 3609.7 Pipe Throughput 12440.0 840578.6 675.7 Pipe-based Context Switching 4000.0 69113.8 172.8 Process Creation 126.0 2092.7 166.1 Shell Scripts (1 concurrent) 42.4 3592.3 847.2 Shell Scripts (8 concurrent) 6.0 1596.2 2660.3 System Call Overhead 15000.0 661908.8 441.3 ======== System Benchmarks Index Score 903.0 ------------------------------------------------------------------------ Benchmark Run: 二 8月 11 2020 11:42:00 - 12:09:16 8 CPUs in system; running 8 parallel copies of tests Dhrystone 2 using register variables 279669766.0 lps (10.0 s, 7 samples) Double-Precision Whetstone 41943.0 MWIPS (6.3 s, 7 samples) Execl Throughput 18412.5 lps (30.0 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 488871.1 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 126347.3 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 1596495.9 KBps (30.0 s, 2 samples) Pipe Throughput 6013413.0 lps (10.0 s, 7 samples) Pipe-based Context Switching 967469.4 lps (10.0 s, 7 samples) Process Creation 25260.2 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 37695.0 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 5645.7 lpm (60.0 s, 2 samples) System Call Overhead 3703628.1 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 279669766.0 23964.8 Double-Precision Whetstone 55.0 41943.0 7626.0 Execl Throughput 43.0 18412.5 4282.0 File Copy 1024 bufsize 2000 maxblocks 3960.0 488871.1 1234.5 File Copy 256 bufsize 500 maxblocks 1655.0 126347.3 763.4 File Copy 4096 bufsize 8000 maxblocks 5800.0 1596495.9 2752.6 Pipe Throughput 12440.0 6013413.0 4833.9 Pipe-based Context Switching 4000.0 967469.4 2418.7 Process Creation 126.0 25260.2 2004.8 Shell Scripts (1 concurrent) 42.4 37695.0 8890.3 Shell Scripts (8 concurrent) 6.0 5645.7 9409.4 System Call Overhead 15000.0 3703628.1 2469.1 ======== System Benchmarks Index Score 3825.7 ======= Script description and score comparison completed! ======= 裸机单核测试 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 make[1]: Entering directory \u0026#39;/root/UnixBench\u0026#39; Checking distribution of files ./pgms exists ./src exists ./testdir exists ./tmp exists ./results exists make[1]: Leaving directory \u0026#39;/root/UnixBench\u0026#39; sh: 1: 3dinfo: not found # # # # # # # ##### ###### # # #### # # # # ## # # # # # # # ## # # # # # # # # # # # ## ##### ##### # # # # ###### # # # # # # ## # # # # # # # # # # # # ## # # # # # # # ## # # # # #### # # # # # ##### ###### # # #### # # Version 5.1.3 Based on the Byte Magazine Unix Benchmark Multi-CPU version Version 5 revisions by Ian Smith, Sunnyvale, CA, USA January 13, 2011 johantheghost at yahoo period com 1 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10 1 x Double-Precision Whetstone 1 2 3 4 5 6 7 8 9 10 1 x Execl Throughput 1 2 3 1 x File Copy 1024 bufsize 2000 maxblocks 1 2 3 1 x File Copy 256 bufsize 500 maxblocks 1 2 3 1 x File Copy 4096 bufsize 8000 maxblocks 1 2 3 1 x Pipe Throughput 1 2 3 4 5 6 7 8 9 10 1 x Pipe-based Context Switching 1 2 3 4 5 6 7 8 9 10 1 x Process Creation 1 2 3 1 x System Call Overhead 1 2 3 4 5 6 7 8 9 10 1 x Shell Scripts (1 concurrent) 1 2 3 1 x Shell Scripts (8 concurrent) 1 2 3 ======================================================================== BYTE UNIX Benchmarks (Version 5.1.3) System: pve: GNU/Linux OS: GNU/Linux -- 5.4.34-1-pve -- #1 SMP PVE 5.4.34-2 (Thu, 07 May 2020 10:02:02 +0200) Machine: x86_64 (unknown) Language: en_US.utf8 (charmap=\u0026#34;UTF-8\u0026#34;, collate=\u0026#34;UTF-8\u0026#34;) CPU 0: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 1: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 2: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 3: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 4: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 5: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 6: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 7: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 8: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 9: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 10: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 11: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 12: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 13: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 14: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 15: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 16: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 17: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 18: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 19: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 20: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 21: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 22: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 23: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 24: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 25: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 26: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 27: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 28: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 29: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 30: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 31: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 32: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 33: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 34: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 35: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 36: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 37: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 38: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 39: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 40: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 41: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 42: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 43: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 44: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 45: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 46: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5000.1 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 47: Intel(R) Xeon(R) CPU E5-2696 v2 @ 2.50GHz (5001.6 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization 14:25:22 up 4:36, 1 user, load average: 0.37, 0.25, 0.15; runlevel 5 ------------------------------------------------------------------------ Benchmark Run: Tue Aug 11 2020 14:25:22 - 14:52:38 48 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 38299234.1 lps (10.0 s, 7 samples) Double-Precision Whetstone 5826.7 MWIPS (6.9 s, 7 samples) Execl Throughput 4424.9 lps (29.7 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 726898.6 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 189465.6 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 2369660.1 KBps (30.0 s, 2 samples) Pipe Throughput 1092621.6 lps (10.0 s, 7 samples) Pipe-based Context Switching 75222.8 lps (10.0 s, 7 samples) Process Creation 2338.4 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 4087.9 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 2078.4 lpm (60.0 s, 2 samples) System Call Overhead 733649.0 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 38299234.1 3281.9 Double-Precision Whetstone 55.0 5826.7 1059.4 Execl Throughput 43.0 4424.9 1029.0 File Copy 1024 bufsize 2000 maxblocks 3960.0 726898.6 1835.6 File Copy 256 bufsize 500 maxblocks 1655.0 189465.6 1144.8 File Copy 4096 bufsize 8000 maxblocks 5800.0 2369660.1 4085.6 Pipe Throughput 12440.0 1092621.6 878.3 Pipe-based Context Switching 4000.0 75222.8 188.1 Process Creation 126.0 2338.4 185.6 Shell Scripts (1 concurrent) 42.4 4087.9 964.1 Shell Scripts (8 concurrent) 6.0 2078.4 3464.0 System Call Overhead 15000.0 733649.0 489.1 ======== System Benchmarks Index Score 1036.5 ------------------------------------------------------------------------ Benchmark Run: Tue Aug 11 2020 14:52:38 - 14:52:38 48 CPUs in system; running 48 parallel copies of tests 搜了一下，没找到指定测试cpu核心数的命令，就只测了单核。\n单核下跑分：\nesxi: 974 效率：94%\npve：903 效率：87%\n裸机：1036\n在我这台机器上他们效率相差 7% 。\n","permalink":"https://blog.curlc.com/archives/730/","summary":"\u003cp\u003e新建的虚拟机下同配置跑的分，均开启了host。配置为 8C8G50G。\u003c/p\u003e\n\u003ch3 id=\"esxi67\"\u003eESXI6.7\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e  1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e112\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e113\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e114\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e115\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e116\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e117\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e118\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e119\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e120\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e121\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e122\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"c1\"\u003e#    #  #    #  #  #    #          #####   ######  #    #   ####   #    #  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"c1\"\u003e#    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"c1\"\u003e#    #  # #  #  #    ##            #####   #####   # #  #  #       ######  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"c1\"\u003e#    #  #  # #  #    ##            #    #  #       #  # #  #       #    #  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"c1\"\u003e#    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e####   #    #  #  #    #          #####   ######  #    #   ####   #    #  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Multi-CPU version                  Version \u003cspan class=\"m\"\u003e5\u003c/span\u003e revisions by Ian Smith,  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                      Sunnyvale, CA, USA  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   January 13, \u003cspan class=\"m\"\u003e2011\u003c/span\u003e                   johantheghost at yahoo period com  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWide character in print at ./Run line 1511.  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWide character in \u003cspan class=\"nb\"\u003eprintf\u003c/span\u003e at ./Run line 1542.  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Dhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Double-Precision Whetstone  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Execl Throughput  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Pipe Throughput  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Pipe-based Context Switching  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Process Creation  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x System Call Overhead  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Shell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Shell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWide character in \u003cspan class=\"nb\"\u003eprintf\u003c/span\u003e at ./Run line 1484.  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Dhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Double-Precision Whetstone  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Execl Throughput  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Pipe Throughput  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Pipe-based Context Switching  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Process Creation  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x System Call Overhead  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Shell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Shell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWide character in \u003cspan class=\"nb\"\u003eprintf\u003c/span\u003e at ./Run line 1484.  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e========================================================================\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   BYTE UNIX Benchmarks \u003cspan class=\"o\"\u003e(\u003c/span\u003eVersion 5.1.3\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   System: debian: GNU/Linux  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   OS: GNU/Linux -- 4.19.0-5-amd64 -- \u003cspan class=\"c1\"\u003e#1 SMP Debian 4.19.37-5 (2019-06-19)  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Machine: x86_64 \u003cspan class=\"o\"\u003e(\u003c/span\u003eunknown\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Language: en_US.utf8 \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003echarmap\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ANSI_X3.4-1968\u0026#34;\u003c/span\u003e, \u003cspan class=\"nv\"\u003ecollate\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ANSI_X3.4-1968\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 0: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 1: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 2: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 3: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 4: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 5: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 6: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 7: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   01:35:22 up  1:33,  \u003cspan class=\"m\"\u003e2\u003c/span\u003e users,  load average: 3.18, 3.77, 2.12\u003cspan class=\"p\"\u003e;\u003c/span\u003e runlevel  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e------------------------------------------------------------------------  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBenchmark Run: 一 8月 \u003cspan class=\"m\"\u003e10\u003c/span\u003e \u003cspan class=\"m\"\u003e2020\u003c/span\u003e 01:35:22 - 02:02:31  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e CPUs in system\u003cspan class=\"p\"\u003e;\u003c/span\u003e running \u003cspan class=\"m\"\u003e1\u003c/span\u003e parallel copy of tests  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables       37275700.7 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDouble-Precision Whetstone                     5654.1 MWIPS \u003cspan class=\"o\"\u003e(\u003c/span\u003e6.2 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExecl Throughput                               4156.3 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks        697111.7 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks          187842.5 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks       2194571.2 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe Throughput                              985672.0 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe-based Context Switching                  46277.6 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcess Creation                               2855.4 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                   4167.8 lpm   \u003cspan class=\"o\"\u003e(\u003c/span\u003e60.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                   1955.7 lpm   \u003cspan class=\"o\"\u003e(\u003c/span\u003e60.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Call Overhead                         688554.4 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Benchmarks Index Values               BASELINE       RESULT    INDEX  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables         116700.0   37275700.7   3194.1  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDouble-Precision Whetstone                       55.0       5654.1   1028.0  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExecl Throughput                                 43.0       4156.3    966.6  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks          3960.0     697111.7   1760.4  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks            1655.0     187842.5   1135.0  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks          5800.0    2194571.2   3783.7  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe Throughput                               12440.0     985672.0    792.3  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe-based Context Switching                   4000.0      46277.6    115.7  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcess Creation                                126.0       2855.4    226.6  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                     42.4       4167.8    983.0  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                      6.0       1955.7   3259.4  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Call Overhead                          15000.0     688554.4    459.0  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                                                   \u003cspan class=\"o\"\u003e========\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Benchmarks Index Score                                         974.5  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e------------------------------------------------------------------------  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBenchmark Run: 一 8月 \u003cspan class=\"m\"\u003e10\u003c/span\u003e \u003cspan class=\"m\"\u003e2020\u003c/span\u003e 02:02:31 - 02:29:45  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e CPUs in system\u003cspan class=\"p\"\u003e;\u003c/span\u003e running \u003cspan class=\"m\"\u003e8\u003c/span\u003e parallel copies of tests  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables      272463301.5 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDouble-Precision Whetstone                    41703.8 MWIPS \u003cspan class=\"o\"\u003e(\u003c/span\u003e6.5 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExecl Throughput                              23978.3 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks        979782.2 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks          263271.7 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks       3177481.5 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe Throughput                             7084002.7 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe-based Context Switching                1632492.5 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcess Creation                              43134.3 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                  44920.5 lpm   \u003cspan class=\"o\"\u003e(\u003c/span\u003e60.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                   6769.3 lpm   \u003cspan class=\"o\"\u003e(\u003c/span\u003e60.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Call Overhead                        4393974.7 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Benchmarks Index Values               BASELINE       RESULT    INDEX  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables         116700.0  272463301.5  23347.3  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDouble-Precision Whetstone                       55.0      41703.8   7582.5  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExecl Throughput                                 43.0      23978.3   5576.3  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks          3960.0     979782.2   2474.2  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks            1655.0     263271.7   1590.8  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks          5800.0    3177481.5   5478.4  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe Throughput                               12440.0    7084002.7   5694.5  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe-based Context Switching                   4000.0    1632492.5   4081.2  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcess Creation                                126.0      43134.3   3423.4  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                     42.4      44920.5  10594.5  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                      6.0       6769.3  11282.1  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Call Overhead                          15000.0    4393974.7   2929.3  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                                                   \u003cspan class=\"o\"\u003e========\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Benchmarks Index Score                                        5383.8  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e=======\u003c/span\u003e Script description and score comparison completed! \u003cspan class=\"o\"\u003e=======\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"pve62\"\u003ePVE6.2\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e  1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e112\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e113\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e114\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e115\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e116\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e117\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e118\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e119\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e120\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e121\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e122\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e123\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e124\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e125\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e126\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e127\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e128\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e129\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e130\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e131\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake\u003cspan class=\"o\"\u003e[\u003c/span\u003e1\u003cspan class=\"o\"\u003e]\u003c/span\u003e: Leaving directory \u003cspan class=\"s1\"\u003e\u0026#39;/opt/unixbench/UnixBench\u0026#39;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elocale: Cannot \u003cspan class=\"nb\"\u003eset\u003c/span\u003e LC_CTYPE to default locale: No such file or directory  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elocale: Cannot \u003cspan class=\"nb\"\u003eset\u003c/span\u003e LC_MESSAGES to default locale: No such file or directory  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elocale: Cannot \u003cspan class=\"nb\"\u003eset\u003c/span\u003e LC_ALL to default locale: No such file or directory  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elocale: Cannot \u003cspan class=\"nb\"\u003eset\u003c/span\u003e LC_CTYPE to default locale: No such file or directory  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elocale: Cannot \u003cspan class=\"nb\"\u003eset\u003c/span\u003e LC_MESSAGES to default locale: No such file or directory  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elocale: Cannot \u003cspan class=\"nb\"\u003eset\u003c/span\u003e LC_ALL to default locale: No such file or directory  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esh: 1: 3dinfo: not found  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esh: 1: runlevel: not found  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"c1\"\u003e#    #  #    #  #  #    #          #####   ######  #    #   ####   #    #  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"c1\"\u003e#    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"c1\"\u003e#    #  # #  #  #    ##            #####   #####   # #  #  #       ######  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"c1\"\u003e#    #  #  # #  #    ##            #    #  #       #  # #  #       #    #  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"c1\"\u003e#    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e####   #    #  #  #    #          #####   ######  #    #   ####   #    #  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Multi-CPU version                  Version \u003cspan class=\"m\"\u003e5\u003c/span\u003e revisions by Ian Smith,  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                      Sunnyvale, CA, USA  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   January 13, \u003cspan class=\"m\"\u003e2011\u003c/span\u003e                   johantheghost at yahoo period com  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWide character in print at ./Run line 1511.  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWide character in \u003cspan class=\"nb\"\u003eprintf\u003c/span\u003e at ./Run line 1542.  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Dhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Double-Precision Whetstone  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Execl Throughput  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Pipe Throughput  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Pipe-based Context Switching  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Process Creation  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x System Call Overhead  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Shell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Shell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWide character in \u003cspan class=\"nb\"\u003eprintf\u003c/span\u003e at ./Run line 1484.  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Dhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Double-Precision Whetstone  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Execl Throughput  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Pipe Throughput  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Pipe-based Context Switching  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Process Creation  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x System Call Overhead  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Shell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e x Shell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWide character in \u003cspan class=\"nb\"\u003eprintf\u003c/span\u003e at ./Run line 1484.  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e========================================================================\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   BYTE UNIX Benchmarks \u003cspan class=\"o\"\u003e(\u003c/span\u003eVersion 5.1.3\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   System: debian: GNU/Linux  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   OS: GNU/Linux -- 4.19.0-5-amd64 -- \u003cspan class=\"c1\"\u003e#1 SMP Debian 4.19.37-5 (2019-06-19)  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Machine: x86_64 \u003cspan class=\"o\"\u003e(\u003c/span\u003eunknown\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   Language: en_US.utf8 \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003echarmap\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ANSI_X3.4-1968\u0026#34;\u003c/span\u003e, \u003cspan class=\"nv\"\u003ecollate\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ANSI_X3.4-1968\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 0: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 1: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 2: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 3: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 4: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 5: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 6: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   CPU 7: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2696 v2 @ 2.50GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e5000.0 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   11:14:36 up \u003cspan class=\"m\"\u003e3\u003c/span\u003e min,  \u003cspan class=\"m\"\u003e2\u003c/span\u003e users,  load average: 0.57, 0.19, 0.06\u003cspan class=\"p\"\u003e;\u003c/span\u003e runlevel  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e------------------------------------------------------------------------  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBenchmark Run: 二 8月 \u003cspan class=\"m\"\u003e11\u003c/span\u003e \u003cspan class=\"m\"\u003e2020\u003c/span\u003e 11:14:36 - 11:42:00  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e CPUs in system\u003cspan class=\"p\"\u003e;\u003c/span\u003e running \u003cspan class=\"m\"\u003e1\u003c/span\u003e parallel copy of tests  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables       38457773.2 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDouble-Precision Whetstone                     5894.1 MWIPS \u003cspan class=\"o\"\u003e(\u003c/span\u003e7.7 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExecl Throughput                               3653.5 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks        594688.8 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks          155116.1 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks       2093652.8 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe Throughput                              840578.6 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe-based Context Switching                  69113.8 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcess Creation                               2092.7 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                   3592.3 lpm   \u003cspan class=\"o\"\u003e(\u003c/span\u003e60.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                   1596.2 lpm   \u003cspan class=\"o\"\u003e(\u003c/span\u003e60.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Call Overhead                         661908.8 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Benchmarks Index Values               BASELINE       RESULT    INDEX  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables         116700.0   38457773.2   3295.4  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDouble-Precision Whetstone                       55.0       5894.1   1071.7  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExecl Throughput                                 43.0       3653.5    849.6  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks          3960.0     594688.8   1501.7  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks            1655.0     155116.1    937.3  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks          5800.0    2093652.8   3609.7  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe Throughput                               12440.0     840578.6    675.7  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe-based Context Switching                   4000.0      69113.8    172.8  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcess Creation                                126.0       2092.7    166.1  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                     42.4       3592.3    847.2  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                      6.0       1596.2   2660.3  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Call Overhead                          15000.0     661908.8    441.3  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                                                   \u003cspan class=\"o\"\u003e========\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Benchmarks Index Score                                         903.0  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e------------------------------------------------------------------------  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBenchmark Run: 二 8月 \u003cspan class=\"m\"\u003e11\u003c/span\u003e \u003cspan class=\"m\"\u003e2020\u003c/span\u003e 11:42:00 - 12:09:16  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e CPUs in system\u003cspan class=\"p\"\u003e;\u003c/span\u003e running \u003cspan class=\"m\"\u003e8\u003c/span\u003e parallel copies of tests  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables      279669766.0 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDouble-Precision Whetstone                    41943.0 MWIPS \u003cspan class=\"o\"\u003e(\u003c/span\u003e6.3 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExecl Throughput                              18412.5 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks        488871.1 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks          126347.3 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks       1596495.9 KBps  \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe Throughput                             6013413.0 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe-based Context Switching                 967469.4 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcess Creation                              25260.2 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                  37695.0 lpm   \u003cspan class=\"o\"\u003e(\u003c/span\u003e60.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                   5645.7 lpm   \u003cspan class=\"o\"\u003e(\u003c/span\u003e60.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Call Overhead                        3703628.1 lps   \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Benchmarks Index Values               BASELINE       RESULT    INDEX  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables         116700.0  279669766.0  23964.8  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDouble-Precision Whetstone                       55.0      41943.0   7626.0  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExecl Throughput                                 43.0      18412.5   4282.0  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks          3960.0     488871.1   1234.5  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks            1655.0     126347.3    763.4  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks          5800.0    1596495.9   2752.6  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe Throughput                               12440.0    6013413.0   4833.9  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe-based Context Switching                   4000.0     967469.4   2418.7  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcess Creation                                126.0      25260.2   2004.8  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                     42.4      37695.0   8890.3  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e                      6.0       5645.7   9409.4  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Call Overhead                          15000.0    3703628.1   2469.1  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                                                   \u003cspan class=\"o\"\u003e========\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Benchmarks Index Score                                        3825.7  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e=======\u003c/span\u003e Script description and score comparison completed! \u003cspan class=\"o\"\u003e=======\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/08/11/image7f4ca00d2f14f750.png\"\u003e\u003c/p\u003e","title":"esxi6.7 与 pve6 unixbench跑分对比"},{"content":"https://blog.curlc.com/archives/595.html\n这台机器买来后idrac有一个问题，只要断电，idrac的密码就会被恢复为上一次设置的密码.如果在bios重置密码也会被“永久”的设置成calvin这个默认密码。\n所以特别蛋疼，每次断电开机完就得修改密码，在dell社区问过一次，答复居然是“一般服务器是不会断电”，真的是无语了\u0026hellip;\u0026hellip;\n昨天由于折腾ssl把idrac搞挂了，这次断电也没有恢复，就进bios重置了idrac(恢复出厂设置)后居然就好了，断电密码被“重置”这个问题也就没了，但是我记得有一次我也重置过，但是没用，总之，这是一个奇葩的问题~\n","permalink":"https://blog.curlc.com/archives/728/","summary":"\u003cp\u003e\u003ca href=\"https://blog.curlc.com/archives/595.html\"\u003ehttps://blog.curlc.com/archives/595.html\u003c/a\u003e\u003cbr\u003e\n这台机器买来后idrac有一个问题，只要断电，idrac的密码就会被恢复为上一次设置的密码.如果在bios重置密码也会被“永久”的设置成calvin这个默认密码。\u003cbr\u003e\n所以特别蛋疼，每次断电开机完就得修改密码，在dell社区问过一次，答复居然是“一般服务器是不会断电”，真的是无语了\u0026hellip;\u0026hellip;\u003c/p\u003e\n\u003cp\u003e昨天由于折腾ssl把idrac搞挂了，这次断电也没有恢复，就进bios重置了idrac(恢复出厂设置)后居然就好了，断电密码被“重置”这个问题也就没了，但是我记得有一次我也重置过，但是没用，总之，这是一个奇葩的问题~\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/08/08/imageffc0305f57c4c4b0.png\"\u003e\u003c/p\u003e","title":"记录IDRAC断电恢复上一次配置(密码)的问题"},{"content":" 查看剩余天数(使用申请的e5账户登录)\nhttps://developer.microsoft.com/zh-cn/microsoft-365/dev-program\nhttps://developer.microsoft.com/zh-cn/microsoft-365/profile\nOffice管理界面组织管理号登录\nwww.office.com/?auth=2\nadmin管理中心\nhttps://admin.microsoft.com Microsoft 365\nOnedrive容量 1T 修改 为5T，老帐号不删除重建\nhttps://blog.curlc.com/archives/66.html\n你没有访问此服务的权限。请联系你的IT部门以获取帮助。（错误代码：0x8004e4d1）\n这种一般是你没有给这个账号许可证。\n自动续期时间\n目前(2020-07-20)调用api情况下， 一般在最后30天以内就会进行续期3个月。\n不注意点击了取消订阅\n(来自读者的反馈)万一手残，还没订阅还没到期就点了取消订阅，显示已禁用，仪表板显示已到期，有这样情况的话，进入office管理界面网站，可以跟微软客服沟通下，他们会手动帮你重新订阅上，只不过， 仪表板还是会显示已到期（这个解决办法是，点击上面的三角形，看到“错过xxx”那个地方，要跟微软写个反馈，反馈你目前的开发进度，用纯英文写，提交之后，看微软审核，审核通过，仪表板就会重新显示剩余天数了）\n如何创建子号\nhttps://admin.microsoft.com/Adminportal/Home?source=applauncher#/users\n以上信息来自于群成员于读者反馈，部分已知名单如下(为保护隐私，已隐藏部分关键字):\nSkyler 942****459\npeakgymnast 隐藏\nvivi fr**@163.com\n","permalink":"https://blog.curlc.com/archives/720/","summary":"\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e查看剩余天数(使用申请的e5账户登录)\u003cbr\u003e\n\u003ca href=\"https://developer.microsoft.com/zh-cn/microsoft-365/dev-program\"\u003ehttps://developer.microsoft.com/zh-cn/microsoft-365/dev-program\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://developer.microsoft.com/zh-cn/microsoft-365/profile\"\u003ehttps://developer.microsoft.com/zh-cn/microsoft-365/profile\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOffice管理界面组织管理号登录\u003cbr\u003e\n\u003ca href=\"https://www.office.com/?auth=2\"\u003ewww.office.com/?auth=2\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eadmin管理中心\u003cbr\u003e\n\u003ca href=\"https://admin.microsoft.com\"\u003ehttps://admin.microsoft.com\u003c/a\u003e Microsoft 365\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOnedrive容量 1T 修改 为5T，老帐号不删除重建\u003cbr\u003e\n\u003ca href=\"https://blog.curlc.com/archives/66.html\"\u003ehttps://blog.curlc.com/archives/66.html\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e你没有访问此服务的权限。请联系你的IT部门以获取帮助。（错误代码：0x8004e4d1）\u003cbr\u003e\n这种一般是你没有给这个账号许可证。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e自动续期时间\u003cbr\u003e\n目前(2020-07-20)调用api情况下， 一般在最后30天以内就会进行续期3个月。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e不注意点击了取消订阅\u003cbr\u003e\n(来自读者的反馈)万一手残，还没订阅还没到期就点了取消订阅，显示已禁用，仪表板显示已到期，有这样情况的话，进入office管理界面网站，可以跟微软客服沟通下，他们会手动帮你重新订阅上，只不过， 仪表板还是会显示已到期（这个解决办法是，点击上面的三角形，看到“错过xxx”那个地方，要跟微软写个反馈，反馈你目前的开发进度，用纯英文写，提交之后，看微软审核，审核通过，仪表板就会重新显示剩余天数了）\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e如何创建子号\u003cbr\u003e\n\u003ca href=\"https://admin.microsoft.com/Adminportal/Home?source=applauncher#/users\"\u003ehttps://admin.microsoft.com/Adminportal/Home?source=applauncher#/users\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e \u003cbr\u003e\n以上信息来自于群成员于读者反馈，部分已知名单如下(为保护隐私，已隐藏部分关键字):\u003cbr\u003e\n \u003cbr\u003e\nSkyler 942****459\u003cbr\u003e\npeakgymnast 隐藏\u003cbr\u003e\nvivi \u003ca href=\"mailto:fr**@163.com\"\u003efr**@163.com\u003c/a\u003e\u003c/p\u003e","title":"office e5 常见问题"},{"content":"1、安装Docker 此命令我在debian中运行没问题，其他系统自测~\n1 wget -qO- https://get.docker.com/ | sh 2、创建docker网络 请参考此文章\nhttps://blog.curlc.com/archives/618.html\n3、Docker安装Redis 其中的 \u0026ndash;net 参数，就是刚刚建立的docker网络(内网)\n1 docker run --name docker-redis-server --restart=always --net=my_network -d redis redis-server --appendonly yes 3、docker安装启动Firedox Send 1 docker run --net=my_network --restart=always -e \u0026#39;REDIS_HOST=docker-redis-server\u0026#39; -e \u0026#39;NODE_ENV=production\u0026#39; -p 1443:1443 -d mozilla/send:latest 4、Nginx反向代理 这一步网上有很多教程，就不重复的写了。\n需要注意的是，必须启用https。\n1 2 3 4 5 6 7 8 9 # 配置反向代理 location / { proxy_pass http://127.0.0.1:1443; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; proxy_set_header Upgrade $http_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } ","permalink":"https://blog.curlc.com/archives/711/","summary":"\u003ch3 id=\"1安装docker\"\u003e1、安装Docker\u003c/h3\u003e\n\u003cp\u003e此命令我在debian中运行没问题，其他系统自测~\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ewget\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eqO\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nl\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"c1\"\u003e//get.docker.com/ | sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"2创建docker网络\"\u003e2、创建docker网络\u003c/h3\u003e\n\u003cp\u003e请参考此文章\u003cbr\u003e\n\u003ca href=\"https://blog.curlc.com/archives/618.html\"\u003ehttps://blog.curlc.com/archives/618.html\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"3docker安装redis\"\u003e3、Docker安装Redis\u003c/h3\u003e\n\u003cp\u003e其中的 \u0026ndash;net 参数，就是刚刚建立的docker网络(内网)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edocker\u003c/span\u003e \u003cspan class=\"n\"\u003erun\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"n\"\u003edocker\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eredis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e  \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003erestart\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ealways\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003enet\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003emy_network\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e \u003cspan class=\"n\"\u003eredis\u003c/span\u003e \u003cspan class=\"n\"\u003eredis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eappendonly\u003c/span\u003e \u003cspan class=\"n\"\u003eyes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"3docker安装启动firedox-send\"\u003e3、docker安装启动Firedox Send\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edocker\u003c/span\u003e \u003cspan class=\"n\"\u003erun\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003enet\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003emy_network\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003erestart\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ealways\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003eREDIS_HOST\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003edocker\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eredis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003eNODE_ENV\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eproduction\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e \u003cspan class=\"mi\"\u003e1443\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1443\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e \u003cspan class=\"n\"\u003emozilla\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nl\"\u003esend\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003elatest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"4nginx反向代理\"\u003e4、Nginx反向代理\u003c/h3\u003e\n\u003cp\u003e这一步网上有很多教程，就不重复的写了。\u003cbr\u003e\n需要注意的是，必须启用https。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e# 配置反向代理  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eproxy_pass\u003c/span\u003e \u003cspan class=\"nl\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"c1\"\u003e//127.0.0.1:1443;  \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003eConnection\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;upgrade\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003eUpgrade\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehttp_upgrade\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003eHost\u003c/span\u003e      \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eReal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eIP\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eremote_addr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eForwarded\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eFor\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproxy_add_x_forwarded_for\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \n\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/06/09/image3a5ce15c8656ba4e.png\"\u003e\u003c/p\u003e","title":"Docker快速搭建Firefox Send"},{"content":"背景 The selected session is a HTTP CONNECT Tunnel.\n所选的会话是 HTTP CONNECT 隧道。 该隧道使客户端能够通过 HTTP\u0026hellip;\u0026hellip;.\nhttps抓包出现这个标识无法解密https会话，证书存储区中可能有一些旧的Fiddler证书，由于某些原因(比如升级版本，更换版本后重新生成证书)，这些证书在重置期间未清除，所以需要手动进行清除旧证书。\n解决方法 请确保未选中Fiddler的HTTPS选项中的“解密HTTPS通信”复选框，然后关闭Fiddler。 然后在Windows的任务栏搜索框中，键入“管理用户证书”，然后按Enter。当前用户的证书管理器将打开。\n找到所有颁发者：DO_NOT_TRUST_FiddlerRoot并删除它们。请小心不要删除任何其他证书。 如果您具有管理权限，请在Windows的任务栏搜索框中键入“管理计算机证书”。本地计算机的证书管理器将打开。\n找到所有颁发者：DO_NOT_TRUST_FiddlerRoot并删除它们。请小心不要删除任何其他证书。 打开Fiddler，然后选中“解密HTTPS流量”复选框。将会出现一些提示，要求信任新生成的CA证书。信任证书，然后重新启动Fiddler。 大概由3个地方需要进行删除，注意点别删到其他证书就好~\n参考文章：\nhttps://www.telerik.com/forums/system-security-cryptography-cryptographicexception#FayHvD9zcUGARfM-gi4pyA\nhttps://www.telerik.com/forums/https-decryption-does-not-work\n","permalink":"https://blog.curlc.com/archives/705/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe selected session is a HTTP CONNECT Tunnel.\u003cbr\u003e\n所选的会话是 HTTP CONNECT 隧道。 该隧道使客户端能够通过 HTTP\u0026hellip;\u0026hellip;.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e \u003cbr\u003e\nhttps抓包出现这个标识无法解密https会话，证书存储区中可能有一些旧的Fiddler证书，由于某些原因(比如升级版本，更换版本后重新生成证书)，这些证书在重置期间未清除，所以需要手动进行清除旧证书。\u003cbr\u003e\n \u003c/p\u003e\n\u003ch2 id=\"解决方法\"\u003e解决方法\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e请确保未选中Fiddler的HTTPS选项中的“解密HTTPS通信”复选框，然后关闭Fiddler。\u003c/li\u003e\n\u003cli\u003e然后在Windows的任务栏搜索框中，键入“管理用户证书”，然后按Enter。当前用户的证书管理器将打开。\u003cbr\u003e\n找到所有颁发者：DO_NOT_TRUST_FiddlerRoot并删除它们。请小心不要删除任何其他证书。\u003c/li\u003e\n\u003cli\u003e如果您具有管理权限，请在Windows的任务栏搜索框中键入“管理计算机证书”。本地计算机的证书管理器将打开。\u003cbr\u003e\n找到所有颁发者：DO_NOT_TRUST_FiddlerRoot并删除它们。请小心不要删除任何其他证书。\u003c/li\u003e\n\u003cli\u003e打开Fiddler，然后选中“解密HTTPS流量”复选框。将会出现一些提示，要求信任新生成的CA证书。信任证书，然后重新启动Fiddler。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e大概由3个地方需要进行删除，注意点别删到其他证书就好~\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/05/18/chrome_obuPTJPoHZfcd0057c49ce76fd.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/05/18/DwF17ExGb7e9c4a976c3a2a9e4.png\"\u003e\u003c/p\u003e\n\u003cp\u003e参考文章：\u003cbr\u003e\n\u003ca href=\"https://www.telerik.com/forums/system-security-cryptography-cryptographicexception#FayHvD9zcUGARfM-gi4pyA\"\u003ehttps://www.telerik.com/forums/system-security-cryptography-cryptographicexception#FayHvD9zcUGARfM-gi4pyA\u003c/a\u003e\u003cbr\u003e\n\u003ca href=\"https://www.telerik.com/forums/https-decryption-does-not-work\"\u003ehttps://www.telerik.com/forums/https-decryption-does-not-work\u003c/a\u003e\u003c/p\u003e","title":"Fiddler无法解密https请求解决方法"},{"content":"看见k20 pro 有pixel的包了，刷了后感觉还不错，比小米要各种权限好多了，还会后台自动刷新权限。\n网上的教程很多，参考了下，有个地方要注意的是，用国内的miui做底包不行，会导致卡在 mi logo界面。\n先刷 twrp 双清及格式化data 刷国际版的miui 11(Android 10 版本的) Wipe Cache/Dalvik 再刷Pixel Experience Wipe Cache/Dalvik 刷机完成后需要 ke xue 上网，不然会卡在登录页面。\n欧盟版 miui 11 下载地址:\nhttps://nchc.dl.sourceforge.net/project/xiaomi-eu-multilang-miui-roms/xiaomi.eu/MIUI-STABLE-RELEASES/MIUIv11/xiaomi.eu_multi_HMK20ProMI9TPro_V11.0.8.0.QFKCNXM_v11-10.zip\nPixel Experience 下载地址：https://download.pixelexperience.org/changelog/raphael/PixelExperience_Plus_raphael-10.0-20200407-0636-OFFICIAL.zip\n2020-05-18： 发现个非常严重得问题，那就4g上网特别差，看了网上说是美国lte频段和国内不同？只能连一个频段？还是刷成国际版用吧。 发现问题是，是系统选择的apn不对，自己手动选下就可以了。 对了，快充也没了。\n2020-06-04:\n在体验了半个月后，发现个特别严重的问题，如果在信号差的地方到信号好的地方，网络一样的慢，而且得手动切换apn才能解决。\n更新时间为：May 16, 2020 23:01\n参考教程：https://blog.kangkang.org/index.php/archives/424\n","permalink":"https://blog.curlc.com/archives/704/","summary":"\u003cp\u003e看见k20 pro 有pixel的包了，刷了后感觉还不错，比小米要各种权限好多了，还会后台自动刷新权限。\u003cbr\u003e\n网上的教程很多，参考了下，有个地方要注意的是，用国内的miui做底包不行，会导致卡在 mi logo界面。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e先刷 twrp\u003c/li\u003e\n\u003cli\u003e双清及格式化data\u003c/li\u003e\n\u003cli\u003e刷国际版的miui 11(Android 10 版本的)\u003c/li\u003e\n\u003cli\u003eWipe Cache/Dalvik\u003c/li\u003e\n\u003cli\u003e再刷Pixel Experience\u003c/li\u003e\n\u003cli\u003eWipe Cache/Dalvik\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e刷机完成后需要 ke xue 上网，不然会卡在登录页面。\u003cbr\u003e\n \u003cbr\u003e\n欧盟版 miui 11 下载地址:\u003cbr\u003e\n\u003ca href=\"https://nchc.dl.sourceforge.net/project/xiaomi-eu-multilang-miui-roms/xiaomi.eu/MIUI-STABLE-RELEASES/MIUIv11/xiaomi.eu_multi_HMK20ProMI9TPro_V11.0.8.0.QFKCNXM_v11-10.zip\"\u003ehttps://nchc.dl.sourceforge.net/project/xiaomi-eu-multilang-miui-roms/xiaomi.eu/MIUI-STABLE-RELEASES/MIUIv11/xiaomi.eu_multi_HMK20ProMI9TPro_V11.0.8.0.QFKCNXM_v11-10.zip\u003c/a\u003e\u003cbr\u003e\nPixel Experience  下载地址：https://download.pixelexperience.org/changelog/raphael/PixelExperience_Plus_raphael-10.0-20200407-0636-OFFICIAL.zip\u003cbr\u003e\n \u003cbr\u003e\n2020-05-18：\n发现个非常严重得问题，那就4g上网特别差，看了网上说是美国lte频段和国内不同？只能连一个频段？还是刷成国际版用吧。\n发现问题是，是系统选择的apn不对，自己手动选下就可以了。\n对了，快充也没了。\u003c/p\u003e\n\u003cp\u003e2020-06-04:\u003cbr\u003e\n在体验了半个月后，发现个特别严重的问题，如果在信号差的地方到信号好的地方，网络一样的慢，而且得手动切换apn才能解决。\u003cbr\u003e\n更新时间为：May 16, 2020 23:01\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/05/17/Screenshot_20200517-0107535769ffd572429bd2e2b.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/05/17/Screenshot_20200517-010626_Pixel_6f3fb015774225f8.png\"\u003e\u003c/p\u003e\n\u003cp\u003e参考教程：https://blog.kangkang.org/index.php/archives/424\u003c/p\u003e","title":"红米K20 Pro 刷Pixel Experience"},{"content":"问题描述： 在安装了这个延时插件后不能清空已加入的消息，删除和重新创建交换是不够的，延迟的消息仍将传递。\n解决办法： 禁用并重新启用插件：\n1 2 rabbitmq-plugins disable rabbitmq_delayed_message_exchange rabbitmq-plugins enable rabbitmq_delayed_message_exchange github问题说明： https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/issues/16\n","permalink":"https://blog.curlc.com/archives/700/","summary":"\u003ch2 id=\"问题描述\"\u003e问题描述：\u003c/h2\u003e\n\u003cp\u003e在安装了这个延时插件后不能清空已加入的消息，删除和重新创建交换是不够的，延迟的消息仍将传递。\u003c/p\u003e\n\u003ch2 id=\"解决办法\"\u003e解决办法：\u003c/h2\u003e\n\u003cp\u003e禁用并重新启用插件：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erabbitmq-plugins disable rabbitmq_delayed_message_exchange  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erabbitmq-plugins \u003cspan class=\"nb\"\u003eenable\u003c/span\u003e rabbitmq_delayed_message_exchange\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \u003cbr\u003e\ngithub问题说明： \u003ca href=\"https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/issues/16\"\u003ehttps://github.com/rabbitmq/rabbitmq-delayed-message-exchange/issues/16\u003c/a\u003e\u003c/p\u003e","title":"rabbitMQ rabbitmq_delayed_message_exchange 清空延时消息"},{"content":"表现为在图形登陆界面能够正常验证密码正误，在正确输入密码后，出现命令行下的自检界面，然后立即闪回到登陆界面。而且这个问题一般是出现在某些账户下，其他账户尤其是guest账户不受影响。而且命令行登陆也不受影响。\n这个问题存在于ubuntu的多个版本中：ubuntu 12.04 ，ubuntu 12.10，ubuntu 13.04，ubuntu 13.10 （勾引搜索引擎用^-^）\n一个最常见的原因是该账户下的的.Xauthority文件的对当前用户没有读写权限。这个文件是用来记录Xserver登陆情况的，而且默认权限限制地很严（只有owner有rw权限），由于某些意外，所有者变成了root，导致我们用当前账号登陆的时候无法完成完整的登陆程序，而被退出。\n修改的方法很简单，通过命令行登陆(Ctrl+Alt+F1)，将拥有者（和组）改为当前用户。\n例如我的用户名为 abc\n使用命令：\ncd ~\nls -a\n(会看到.Xauthority的所有者和组是root)\nsudo chown abc:abc .Xauthority\n*返回图形界面：Ctrl+Alt+F7\n本文转载至：http://blog.csdn.net/yanxiangtianji\n","permalink":"https://blog.curlc.com/archives/696/","summary":"\u003cp\u003e表现为在图形登陆界面能够正常验证密码正误，在正确输入密码后，出现命令行下的自检界面，然后立即闪回到登陆界面。而且这个问题一般是出现在某些账户下，其他账户尤其是guest账户不受影响。而且命令行登陆也不受影响。\u003cbr\u003e\n这个问题存在于ubuntu的多个版本中：ubuntu 12.04 ，ubuntu 12.10，ubuntu 13.04，ubuntu 13.10 （勾引搜索引擎用^-^）\u003cbr\u003e\n一个最常见的原因是该账户下的的.Xauthority文件的对当前用户没有读写权限。这个文件是用来记录Xserver登陆情况的，而且默认权限限制地很严（只有owner有rw权限），由于某些意外，所有者变成了root，导致我们用当前账号登陆的时候无法完成完整的登陆程序，而被退出。\u003cbr\u003e\n修改的方法很简单，通过命令行登陆(Ctrl+Alt+F1)，将拥有者（和组）改为当前用户。\u003cbr\u003e\n例如我的用户名为 abc\u003cbr\u003e\n使用命令：\u003cbr\u003e\ncd ~\u003cbr\u003e\nls -a\u003cbr\u003e\n(会看到.Xauthority的所有者和组是root)\u003cbr\u003e\nsudo chown abc:abc .Xauthority\u003cbr\u003e\n*返回图形界面：Ctrl+Alt+F7\u003cbr\u003e\n \u003cbr\u003e\n本文转载至：http://blog.csdn.net/yanxiangtianji\u003c/p\u003e","title":"ubuntu 循环登陆（闪退，登陆成功后又跳回登陆界面）"},{"content":" frp\nFRP 功能完整，主要采用 GO 语言实现，重量级的工具，服务端界面样式风格一般。\n配置繁琐，不同的协议需要配置不同的参数，采用文件存放数据，不支持数据库管理数据。\nhttps://github.com/fatedier/frp holer\n轻量级的内网穿透工具，holer 服务端采用 Java 语言实现，服务端界面漂亮简洁。\nHoler 客户端采用了 Java 语言和 GO 语言实现了两种版本，支持几乎所有的 OS 平台。\n用到流行的微服务框架 springboot 和 Java 网络框架 netty。\n配置很简单，针对所有 TCP 协议只需在客户端设置一个 holer access key 即可。\n采用 MySQL 数据库统一管理数据。\nhttps://github.com/wisdom-projects/holer nps\n轻量级的内网穿透工具，完全采用 GO 语言实现，服务端界面漂亮简洁。\n支持的协议最广泛，配置稍简单，采用文件存放数据，不支持数据库管理数据。\nhttps://github.com/ehang-io/nps lanproxy\n轻量级的内网穿透工具，客户端采用 GO 语言和 Java 语言实现两种版本，采用了 Java 网络框架 netty，服务端界面体验较差。\n配置稍繁琐，采用文件存放数据，不支持数据库管理数据。\nhttps://github.com/ffay/lanproxy ","permalink":"https://blog.curlc.com/archives/693/","summary":"\u003col\u003e\n\u003cli\u003efrp\u003cbr\u003e\nFRP 功能完整，主要采用 GO 语言实现，重量级的工具，服务端界面样式风格一般。\u003cbr\u003e\n配置繁琐，不同的协议需要配置不同的参数，采用文件存放数据，不支持数据库管理数据。\u003cbr\u003e\n\u003ca href=\"https://github.com/fatedier/frp\"\u003ehttps://github.com/fatedier/frp\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eholer\u003cbr\u003e\n轻量级的内网穿透工具，holer 服务端采用 Java 语言实现，服务端界面漂亮简洁。\u003cbr\u003e\nHoler 客户端采用了 Java 语言和 GO 语言实现了两种版本，支持几乎所有的 OS 平台。\u003cbr\u003e\n用到流行的微服务框架 springboot 和 Java 网络框架 netty。\u003cbr\u003e\n配置很简单，针对所有 TCP 协议只需在客户端设置一个 holer access key 即可。\u003cbr\u003e\n采用 MySQL 数据库统一管理数据。\u003cbr\u003e\n\u003ca href=\"https://github.com/wisdom-projects/holer\"\u003ehttps://github.com/wisdom-projects/holer\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003enps\u003cbr\u003e\n轻量级的内网穿透工具，完全采用 GO 语言实现，服务端界面漂亮简洁。\u003cbr\u003e\n支持的协议最广泛，配置稍简单，采用文件存放数据，不支持数据库管理数据。\u003cbr\u003e\n\u003ca href=\"https://github.com/ehang-io/nps\"\u003ehttps://github.com/ehang-io/nps\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003elanproxy\u003cbr\u003e\n轻量级的内网穿透工具，客户端采用 GO 语言和 Java 语言实现两种版本，采用了 Java 网络框架 netty，服务端界面体验较差。\u003cbr\u003e\n配置稍繁琐，采用文件存放数据，不支持数据库管理数据。\u003cbr\u003e\n\u003ca href=\"https://github.com/ffay/lanproxy\"\u003ehttps://github.com/ffay/lanproxy\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e","title":"常用内网穿透工具"},{"content":"上次说到 简书移动端Web劫持、跳转app问题\n我个人原本是是在dnsmasq里面屏蔽ad.lflucky.com这个域名，刚好今天评论里有位读者说AdGuard Home也不错，所以就尝试了下，可视化界面配合起来用着也是很爽~\n我是用的软路由 x86 的openwrt，刚好可以安装替换原本的dnsmasq，命令有些区别但是也不太大。\n可以使用docker，在内网中用着超级爽~\nAdGuard Home 是一款全网广告拦截与反跟踪软件。在您将其安装完毕后，它将保护您所有家用设备，同时您不再需要安装任何客户端软件。随着物联网与连接设备的兴起，掌控您自己的整个网络环境变得越来越重要。\n项目主页: https://github.com/AdguardTeam/AdGuardHome AdGuard Home主要功能 拦截随处可见的广告 注重隐私保护 家庭保护模式 自定义过滤 CentOS 7 X64安装 AdGuard Home二进制文件位于https://github.com/AdguardTeam/AdGuardHome/releases 可根据自己的平台下载最新版本。\n安装在openwrt的路由中倒也是可以，下载 AdGuardHome_linux_mips.tar.gz 这个包安装。在操作上都差不多，只是防火墙配置这一块需要自行去改一下。 CentOS 7安装方法如下：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #下载AdGuard Home wget http://soft.xiaoz.org/linux/AdGuardHome_v0.93_linux_amd64.tar.gz #解压 tar -zxvf AdGuardHome_v0.93_linux_amd64.tar.gz #进入AdGuardHome目录 cd AdGuardHome #放行3000端口（AdGuardHome初始化需要使用） #firewalld放行3000端口 firewall-cmd --zone=public --add-port=3000/tcp --permanent firewall-cmd --reload #iptables放行3000端口 iptables -A INPUT -p tcp --dport 3000 -j ACCEPT service iptables save #启动AdGuard Home ./AdGuardHome 运行AdGuardHome后，会提示打开http://IP：3000端口进行初始化。 web管理端口建议不要设置80端口，以免冲突~\n设置上游DNS AdGuard Home默认使用Cloudflare DNS作为上游服务器，如果您服务器在国内可能请求上游DNS延迟比较高，在后台 - 设定 - 可以设置为国内的DNS，如腾讯的119.29.29.29，但坏处是不支持DNS over TLS 过滤器 在后台 - 过滤器，可以看到AdGuardHome内置了部分广告过滤规则，但在中国有点水土不服，如果要想更完美的实现广告屏蔽还需要自己添加规则。 推荐一个规则： https://anti-ad.win/ 额外设置 为了方便管理，可以继续输入命令./AdGuardHome -s install安装为服务，然后就可以使用下面的命令来进行管理。\n1 2 3 4 5 6 7 8 #启动 systemctl start AdGuardHome #开机自启 systemctl enable AdGuardHome #重启 systemctl restart AdGuardHome #停止 systemctl stop AdGuardHome DNS默认使用53(TCP/UDP)端口进行通信，因此别忘记放行53端口，否则DNS无法正常使用。 同时还有web管理端口\n1 2 3 4 5 6 7 8 #firewalld放行53端口 firewall-cmd --zone=public --add-port=53/tcp --permanent firewall-cmd --zone=public --add-port=53/udp --permanent firewall-cmd --reload #iptables放行53端口 iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j ACCEPT service iptables save 拦截效果 参考文章： https://www.xiaoz.me/archives/12318\n","permalink":"https://blog.curlc.com/archives/679/","summary":"\u003cp\u003e上次说到 \u003ca href=\"https://blog.curlc.com/archives/600.html\"\u003e简书移动端Web劫持、跳转app问题\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e我个人原本是是在dnsmasq里面屏蔽ad.lflucky.com这个域名，刚好今天评论里有位读者说AdGuard Home也不错，所以就尝试了下，可视化界面配合起来用着也是很爽~\u003c/p\u003e\n\u003cp\u003e我是用的软路由 x86 的openwrt，刚好可以安装替换原本的dnsmasq，命令有些区别但是也不太大。\u003c/p\u003e\n\u003cp\u003e可以使用docker，在内网中用着超级爽~\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAdGuard Home 是一款全网广告拦截与反跟踪软件。在您将其安装完毕后，它将保护您所有家用设备，同时您不再需要安装任何客户端软件。随着物联网与连接设备的兴起，掌控您自己的整个网络环境变得越来越重要。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e项目主页: \u003ca href=\"https://github.com/AdguardTeam/AdGuardHome\"\u003ehttps://github.com/AdguardTeam/AdGuardHome\u003c/a\u003e\n\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/02/12/image11463df069d4bb82.png\"\u003e\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch3 id=\"adguard-home主要功能\"\u003eAdGuard Home主要功能\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e拦截随处可见的广告\u003c/li\u003e\n\u003cli\u003e注重隐私保护\u003c/li\u003e\n\u003cli\u003e家庭保护模式\u003c/li\u003e\n\u003cli\u003e自定义过滤\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"centos-7-x64安装\"\u003eCentOS 7 X64安装\u003c/h3\u003e\n\u003cp\u003eAdGuard Home二进制文件位于\u003ca href=\"https://github.com/AdguardTeam/AdGuardHome/releases\"\u003ehttps://github.com/AdguardTeam/AdGuardHome/releases\u003c/a\u003e 可根据自己的平台下载最新版本。\u003c/p\u003e\n\u003cp\u003e安装在openwrt的路由中倒也是可以，下载 \u003ca href=\"https://github.com/AdguardTeam/AdGuardHome/releases/download/v0.100.9/AdGuardHome_linux_mips.tar.gz\"\u003eAdGuardHome_linux_mips.tar.gz\u003c/a\u003e 这个包安装。在操作上都差不多，只是防火墙配置这一块需要自行去改一下。\n \nCentOS 7安装方法如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#下载AdGuard Home\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget http://soft.xiaoz.org/linux/AdGuardHome_v0.93_linux_amd64.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#解压\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etar -zxvf AdGuardHome_v0.93_linux_amd64.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#进入AdGuardHome目录\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e AdGuardHome\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#放行3000端口（AdGuardHome初始化需要使用）\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#firewalld放行3000端口\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efirewall-cmd --zone\u003cspan class=\"o\"\u003e=\u003c/span\u003epublic --add-port\u003cspan class=\"o\"\u003e=\u003c/span\u003e3000/tcp --permanent\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efirewall-cmd --reload\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#iptables放行3000端口\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eiptables -A INPUT -p tcp --dport \u003cspan class=\"m\"\u003e3000\u003c/span\u003e -j ACCEPT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eservice iptables save\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#启动AdGuard Home\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./AdGuardHome\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e运行AdGuardHome后，会提示打开\u003ccode\u003ehttp://IP：3000\u003c/code\u003e端口进行初始化。\nweb管理端口建议不要设置80端口，以免冲突~\u003c/p\u003e","title":"679.AdGuard Home 搭建一个无广告DNS"},{"content":" 1 2 16:50:10.134 ERROR 17788 --- o.s.a.r.c.CachingConnectionFactory : Channel shutdown: channel error; protocol method: #method\u0026lt;channel.close\u0026gt;(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80) 在设置手动确认ACK后老是会出现这个错误，虽然不影响消息接收，但是每次报错都会重连。 除了在配置文件中设置手动ack以外，还需要在RabbitMQConfig中设置，按照参考文章上说的是\n被注解注入的SimpleRabbitListenerContainerFactory覆盖，而它默认使用了自动签收。但是消费消息的时候又手动进行channel.basicAck(deliveryTag, false)，于是导致了两次ack,所以报错。\n因为需要手动设置ack的话，那么在消费端需要@RabbitListener注解放到方法上，同时指定containerFactory，不然会出现无限循环错误。官方解释 而刚好设置了 rabbitListenerContainerFactory ,返回类型是SimpleRabbitListenerContainerFactory，刚好被覆盖了，所以得再次手动设置一次。\n1 2 3 4 5 @RabbitHandler @RabbitListener(queues = \u0026#34;DirectQueue\u0026#34;, containerFactory = \u0026#34;rabbitListenerContainerFactory\u0026#34;) public void listen(Message message, Channel channel) { //........................... } 1 2 3 4 5 6 7 8 9 #消费者最小数量 spring.rabbitmq.listener.simple.concurrency=1 #消费之最大数量 spring.rabbitmq.listener.simple.max-concurrency=10 #设置消费端手动 ack # 被注解注入的SimpleRabbitListenerContainerFactory覆盖，而它默认使用了自动签收。但是消费消息的时候又手动进行channel.basicAck(deliveryTag, false)，于是导致了两次ack,所以报错。 spring.rabbitmq.listener.simple.acknowledge-mode=manual # 限流 #spring.rabbitmq.listener.simple.prefetch=1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { RabbitTemplate template = new RabbitTemplate(connectionFactory); template.setMessageConverter(new Jackson2JsonMessageConverter()); return template; } @Bean public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); //此处也设置为手动ack factory.setAcknowledgeMode(AcknowledgeMode.MANUAL); factory.setConnectionFactory(connectionFactory); factory.setMessageConverter(new Jackson2JsonMessageConverter()); return factory; } 参考文章:https://blog.csdn.net/more_try/article/details/82804387\n","permalink":"https://blog.curlc.com/archives/676/","summary":"\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e16:50:10.134 ERROR 17788 --- o.s.a.r.c.CachingConnectionFactory :\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eChannel shutdown: channel error; protocol method: #method\u0026lt;channel.close\u0026gt;(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \n在设置手动确认ACK后老是会出现这个错误，虽然不影响消息接收，但是每次报错都会重连。\n除了在配置文件中设置手动ack以外，还需要在RabbitMQConfig中设置，按照参考文章上说的是\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e被注解注入的SimpleRabbitListenerContainerFactory覆盖，而它默认使用了自动签收。但是消费消息的时候又手动进行channel.basicAck(deliveryTag, false)，于是导致了两次ack,所以报错。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e因为需要手动设置ack的话，那么在消费端需要@RabbitListener注解放到方法上，同时指定containerFactory，不然会出现无限循环错误。\u003ca href=\"https://jira.spring.io/browse/AMQP-573\"\u003e官方解释\u003c/a\u003e\n而刚好设置了 rabbitListenerContainerFactory ,返回类型是SimpleRabbitListenerContainerFactory，刚好被覆盖了，所以得再次手动设置一次。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-java\" data-lang=\"java\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nd\"\u003e@RabbitHandler\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nd\"\u003e@RabbitListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003equeues\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;DirectQueue\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econtainerFactory\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;rabbitListenerContainerFactory\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003elisten\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMessage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eChannel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echannel\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e//...........................\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#消费者最小数量\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.rabbitmq.listener.simple.concurrency=1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#消费之最大数量\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.rabbitmq.listener.simple.max-concurrency=10\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#设置消费端手动 ack\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# 被注解注入的SimpleRabbitListenerContainerFactory覆盖，而它默认使用了自动签收。但是消费消息的时候又手动进行channel.basicAck(deliveryTag, false)，于是导致了两次ack,所以报错。\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"l\"\u003espring.rabbitmq.listener.simple.acknowledge-mode=manual\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e# 限流\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c\"\u003e#spring.rabbitmq.listener.simple.prefetch=1\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \u003c/p\u003e","title":"676.RabbitMQ double ack 报错"},{"content":"1、编辑nginx.conf，在http区域内添加下面配置： 1 2 3 4 map $http_upgrade $connection_upgrade { default upgrade; \u0026#39;\u0026#39; close; } map指令的作用： 该作用主要是根据客户端请求中$http_upgrade 的值，来构造改变$connection_upgrade的值，即根据变量$http_upgrade的值创建新的变量$connection_upgrade， 创建的规则就是{}里面的东西。其中的规则没有做匹配，因此使用默认的，即 $connection_upgrade 的值会一直是 upgrade。然后如果 $http_upgrade为空字符串的话， 那值会是 close。\n2、虚拟主机的配置文件，在location匹配配置中添加如下内容： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;Upgrade\u0026#34;; 示例如下： upstream socket.kevin.com { hash $remote_addr consistent; server 10.0.12.108:9000; server 10.0.12.109:9000; } location / { proxy_pass http://socket.kevin.com/; proxy_set_header Host $host:$server_port; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } 3、Nginx代理webSocket经常中断的解决方法（也就是如何保持长连接） 现象描述：用nginx反代代理某个业务，发现平均1分钟左右，就会出现webSocket连接中断，然后查看了一下，是nginx出现的问题。 产生原因：nginx等待第一次通讯和第二次通讯的时间差，超过了它设定的最大等待时间，简单来说就是超时！\n解决方法1 其实只要配置nginx.conf的对应localhost里面的这几个参数就好 proxy_connect_timeout; proxy_read_timeout; proxy_send_timeout;\n解决方法2 发心跳包，原理就是在有效地再读时间内进行通讯，重新刷新再读时间\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 配置示例： http { server { location / { root html; index index.html index.htm; proxy_pass http://webscoket; proxy_http_version 1.1; proxy_connect_timeout 4s; #配置点1 proxy_read_timeout 60s; #配置点2，如果没效，可以考虑这个时间配置长一点 proxy_send_timeout 12s; #配置点3 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;Upgrade\u0026#34;; } } } 关于上面配置2的解释 这个是服务器对你等待最大的时间，也就是说当你webSocket使用nginx转发的时候，用上面的配置2来说，如果60秒内没有通讯，依然是会断开的，所以，你可以按照你的需求来设定。比如说，我设置了10分钟，那么如果我10分钟内有通讯，或者10分钟内有做心跳的话，是可以保持连接不中断的，详细看个人需求 WebSocket与Socket的关系\nSocket其实并不是一个协议，而是为了方便使用TCP或UDP而抽象出来的一层，是位于应用层和传输控制层之间的一组接口。当两台主机通信时，必须通过Socket连接，Socket则利用TCP/IP协议建立TCP连接。TCP连接则更依靠于底层的IP协议，IP协议的连接则依赖于链路层等更低层次。 WebSocket就像HTTP一样，则是一个典型的应用层协议。 总的来说：Socket是传输控制层接口，WebSocket是应用层协议。 本文转载至:https://blog.csdn.net/u011411069/article/details/98475433 ","permalink":"https://blog.curlc.com/archives/664/","summary":"\u003ch2 id=\"1编辑nginxconf在http区域内添加下面配置\"\u003e1、编辑nginx.conf，在http区域内添加下面配置：\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emap $http_upgrade $connection_upgrade {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    default upgrade;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;\u0026#39; close;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003emap指令的作用：\n该作用主要是根据客户端请求中$http_upgrade 的值，来构造改变$connection_upgrade的值，即根据变量$http_upgrade的值创建新的变量$connection_upgrade，\n创建的规则就是{}里面的东西。其中的规则没有做匹配，因此使用默认的，即 $connection_upgrade 的值会一直是 upgrade。然后如果 $http_upgrade为空字符串的话，\n那值会是 close。\u003c/p\u003e\n\u003ch2 id=\"2虚拟主机的配置文件在location匹配配置中添加如下内容\"\u003e2、虚拟主机的配置文件，在location匹配配置中添加如下内容：\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eproxy_http_version 1.1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eproxy_set_header Upgrade $http_upgrade;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eproxy_set_header Connection \u0026#34;Upgrade\u0026#34;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e示例如下：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupstream socket.kevin.com {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    hash $remote_addr consistent;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    server 10.0.12.108:9000;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    server 10.0.12.109:9000;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e location / {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            proxy_pass http://socket.kevin.com/;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            proxy_set_header Host $host:$server_port;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            proxy_http_version 1.1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            proxy_set_header Upgrade $http_upgrade;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            proxy_set_header Connection \u0026#34;upgrade\u0026#34;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \u003c/p\u003e","title":"[转]nginx 开启websocket"},{"content":"\n一键DD Linux系统的用途 基本所有的VPS服务器商家，都会提供免费的Linux系统供安装，比如CentOS、Debian、Ubuntu等。那为什么还要使用一键DD脚本重装/更换系统呢？\n商家提供的系统版本有限，可能没有自己需要的版本。 商家的系统安装有自己不想要的服务，比如国内的阿里云盾（安骑士）。 商家的系统无法安装特定软件，比如很挑内核的锐速。 以上几种情况，一键DD脚本就可以为服务器更换一个纯净的系统，帮你解决问题。\n所需环境 以网络流传较广的Vicer一键DD为例，其所需环境为： **架构：**KVM/XEN，不支持OpenVZ。 **系统：**Debian/Ubuntu/CentOS 一键DD脚本使用教程 注意事项：\nVicer脚本目前不支持重装为CentOS 7系统，支持CentOS 6.9以下版本。 重装的系统源自官方发行版。 安装过程全自动进行，无需VNC操作，无需进入救援模式。 系统安装完成后的默认用户名为root，默认密码为:MoeClub.org DD脚本示例： 由于脚本命令中需要写明目标系统版本，所以根据需求不同，最终的运行命令也各不相同。 下面提供几个使用范例，可以直接复制使用，也可以将命令中的系统版本替换为其它版本。 重装为CentOS 6.9： 以下命令中的 -c 后面为CentOS版本号，-v 后面为64位/32位，可根据需求进行替换。\n1 2 3 4 # CentOS 6.9 64位： bash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -c 6.9 -v 64 -a # CentOS 6.9 32位： bash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -c 6.9 -v 32 -a 重装为Debian： 以下命令中的 -d 后面为Debian版本号，-v 后面为64位/32位，可根据需求进行替换。\n1 2 3 4 # Debian 8 64位： bash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -d 8 -v 64 -a # Debian 9 64位： bash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -d 9 -v 64 -a 重装为Ubuntu： 以下命令中的 -u 后面为Ubuntu版本号，-v 后面为64位/32位，可根据需求进行替换。\n1 2 3 4 5 6 7 8 # Ubuntu 12.04 64位： bash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -u 12.04 -v 64 -a # Ubuntu 14.04 64位： bash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -u 14.04 -v 64 -a # Ubuntu 16.04 64位： bash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -u 16.04 -v 64 -a # Ubuntu 18.04 64位： bash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -u 18.04 -v 64 -a 关于系统重装过程 运行包含正确系统版本号的脚本后，新系统的安装会自动进行，无需人工干预。 可能的三种情况： 正常情况下10分钟左右就可以安装成功了，期间可以在VNC中观察安装过程：\n如果安装CentOS 7版本，会出现下图提示，表示不支持：\n如果输入了其它不支持或不存在的系统版本，则会出现下图提示，中止安装：\n重装系统后更改root密码 耐心等待系统安装成功后，出于安全考虑，建议立即更改默认密码。\n具体方法：\n1.使用Putty以上文提供的默认密码登录，输入以下命令：passwd root\n2.接下来会分两次要求输入新的密码，可以手动输入，也可以在其它位置复制一个密码，然后在Putty界面右键点击即可粘贴上去。 注意：输入新密码时并不会直接显示出来，光标也不会移动，这是正常的。\n3.再次登录系统时，记得使用新的root密码。\n本文转载至: https://ssr.tools/693\n","permalink":"https://blog.curlc.com/archives/648/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2019/12/21/image2f4e3f55ff66a9e2.png\"\u003e\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch3 id=\"一键dd-linux系统的用途\"\u003e一键DD Linux系统的用途\u003c/h3\u003e\n\u003cp\u003e基本所有的VPS服务器商家，都会提供免费的Linux系统供安装，比如CentOS、Debian、Ubuntu等。那为什么还要使用一键DD脚本重装/更换系统呢？\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e商家提供的系统版本有限，可能没有自己需要的版本。\u003c/li\u003e\n\u003cli\u003e商家的系统安装有自己不想要的服务，比如国内的阿里云盾（安骑士）。\u003c/li\u003e\n\u003cli\u003e商家的系统无法安装特定软件，比如很挑内核的锐速。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e以上几种情况，一键DD脚本就可以为服务器更换一个纯净的系统，帮你解决问题。\u003c/p\u003e\n\u003ch3 id=\"所需环境\"\u003e所需环境\u003c/h3\u003e\n\u003cp\u003e以网络流传较广的Vicer一键DD为例，其所需环境为：\n**架构：**KVM/XEN，不支持OpenVZ。\n**系统：**Debian/Ubuntu/CentOS\n \u003c/p\u003e\n\u003ch3 id=\"一键dd脚本使用教程\"\u003e一键DD脚本使用教程\u003c/h3\u003e\n\u003cp\u003e注意事项：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVicer脚本目前不支持重装为CentOS 7系统，支持CentOS 6.9以下版本。\u003c/li\u003e\n\u003cli\u003e重装的系统源自官方发行版。\u003c/li\u003e\n\u003cli\u003e安装过程全自动进行，无需VNC操作，无需进入救援模式。\u003c/li\u003e\n\u003cli\u003e系统安装完成后的默认用户名为root，\u003cstrong\u003e默认密码为:MoeClub.org\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eDD脚本示例：\u003c/strong\u003e\n由于脚本命令中需要写明目标系统版本，所以根据需求不同，最终的运行命令也各不相同。\n下面提供几个使用范例，可以直接复制使用，也可以将命令中的系统版本替换为其它版本。\n \u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e重装为CentOS 6.9：\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e以下命令中的 -c 后面为CentOS版本号，-v 后面为64位/32位，可根据需求进行替换。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# CentOS 6.9 64位：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -c 6.9 -v 64 -a\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# CentOS 6.9 32位：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -c 6.9 -v 32 -a\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e重装为Debian：\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e以下命令中的 -d 后面为Debian版本号，-v 后面为64位/32位，可根据需求进行替换。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Debian 8 64位：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -d 8 -v 64 -a\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Debian 9 64位：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebash \u0026lt;(wget --no-check-certificate -qO- \u0026#39;https://moeclub.org/attachment/LinuxShell/InstallNET.sh\u0026#39;) -d 9 -v 64 -a\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \u003c/p\u003e","title":"一键DD脚本(萌咖) CentOS/Debian/Ubuntu"},{"content":"黑5上手的一台机器，网络为 500Mbps。 具体位置： 美国 俄勒冈州 希尔斯伯勒\n基础测试 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 -------------------------------------------------------------------------- CPU 型号 : Intel(R) Xeon(R) CPU E3-1270 v6 @ 3.80GHz CPU 核心数 : 8 CPU 频率 : 4000.854 MHz 总硬盘大小 : 7372.9 GB (14.6 GB Used) 总内存大小 : 31859 MB (775 MB Used) SWAP大小 : 1021 MB (0 MB Used) 开机时长 : 0 days, 14 hour 34 min 系统负载 : 0.15, 0.03, 0.01 系统 : Debian GNU/Linux 9 架构 : x86_64 (64 Bit) 内核 : 4.11.8-041108-generic 虚拟化平台 : No Virt -------------------------------------------------------------------------- 硬盘I/O (第一次测试) : 290 MB/s 硬盘I/O (第二次测试) : 288 MB/s 硬盘I/O (第三次测试) : 305 MB/s -------------------------------------------------------------------------- 节点名称 IP地址 下载速度 延迟 CacheFly 205.234.175.175 38.8MB/s 62.435 ms Linode, Tokyo, JP ms Linode, Singapore, SG 139.162.23.4 11.0MB/s 202.753 ms Linode, London, UK 176.58.107.39 17.0MB/s 146.624 ms Linode, Frankfurt, DE 139.162.130.8 15.8MB/s 149.624 ms Linode, Fremont, CA 50.116.14.9 99.4MB/s 25.793 ms Softlayer, Dallas, TX 173.192.68.18 25.0MB/s 64.434 ms Softlayer, Seattle, WA 67.228.112.250 26.9MB/s 59.743 ms Softlayer, Frankfurt, DE 159.122.69.4 17.5MB/s 145.023 ms Softlayer, Singapore, SG 119.81.28.170 7.49MB/s 229.720 ms Softlayer, HongKong, CN 119.81.130.170 8.68MB/s 205.621 ms -------------------------------------------------------------------------- 节点名称 上传速度 下载速度 延迟 西安电信 7.18 Mbit/s 56.44 Mbit/s 386.264 ms 北京联通 2.70 Mbit/s 6.97 Mbit/s 545.524 ms -------------------------------------------------------------------------- 合肥 : 269.5 ms 北京 : 284.4 ms 武汉 : 250.65 ms 昌吉 : Fail 成都 : Fail 上海 : Fail 太原 : 26.75 ms 杭州 : 266.23 ms 宁夏 : 259.12 ms 呼和浩特 : 276.83 ms 南昌 : Fail 拉萨 : Fail 乌鲁木齐 : 342.9 ms 天津 : 256.98 ms 襄阳 : Fail 郑州 : 248.19 ms 沈阳 : Fail 兰州 : 280.55 ms 哈尔滨 : Fail 宁波 : Fail 苏州 : Fail 济南 : 266.44 ms 西安 : 272.7 ms 西宁 : Fail 重庆 : 290.53 ms 深圳 : Fail 南京 : Fail 长沙 : Fail 长春 : 251.61 ms 福州 : 266.7 ms -------------------------------------------------------------------------- Node Name Upload Speed Download Speed Latency Speedtest.net 220.71 Mbit/s 324.46 Mbit/s (*) 94.414 ms Fast.com 0.00 Mbit/s 193.9 Mbit/s - Beijing 5G CT 15.31 Mbit/s 10.29 Mbit/s - Nanjing 5G CT 13.36 Mbit/s 69.16 Mbit/s - Hefei 5G CT 12.75 Mbit/s 74.79 Mbit/s - TianJin 5G CU 17.55 Mbit/s 90.03 Mbit/s - Shanghai 5G CU 18.51 Mbit/s 33.72 Mbit/s - Guangzhou 5G CU 13.88 Mbit/s 58.99 Mbit/s - Tianjin 5G CM 14.85 Mbit/s 50.37 Mbit/s - Wuxi 5G CM 7.29 Mbit/s 20.44 Mbit/s - Nanjing 5G CM 10.88 Mbit/s 97.14 Mbit/s - Hefei 5G CM 50.01 Mbit/s 9.86 Mbit/s - Changsha 5G CM 3.28 Mbit/s 584.95 Mbit/s - 电信回程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 root@0f35ba2a2e97:~# ./besttrace -q 1 sc.189.cn traceroute to sc.189.cn (61.157.77.198), 30 hops max, 60 byte packets 1 172.17.0.1 0.04 ms * 局域网 2 147.135.44.252 0.76 ms AS16276 美国 俄勒冈州 希尔斯伯勒 ovh.com 3 10.23.137.188 0.30 ms * 局域网 4 10.244.17.16 0.61 ms * 局域网 5 10.244.72.12 0.18 ms * 局域网 6 10.244.120.68 0.81 ms * 局域网 7 pao-sv8-bb1-a9.ca.us (142.44.208.8) 17.09 ms AS16276 美国 加利福尼亚州 帕洛阿尔托 ovh.com 8 * 9 sjo-b21-link.telia.net (62.115.125.1) 18.48 ms AS1299 美国 加利福尼亚州 圣何塞 telia.com 10 218.30.54.181 25.80 ms AS4134 美国 加利福尼亚州 圣何塞 ctamericas.com 11 202.97.62.5 87.25 ms AS4134 美国 加利福尼亚州 圣何塞 电信 12 202.97.25.133 255.24 ms AS4134 中国 广东 广州 电信 13 202.97.94.93 254.93 ms AS4134 中国 广东 广州 电信 14 202.97.94.133 266.67 ms AS4134 中国 广东 广州 电信 15 202.97.36.222 293.95 ms AS4134 中国 四川 成都 电信 16 * 17 182.150.16.150 296.47 ms AS4134 中国 四川 成都 电信 联通回程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 traceroute to www.10010.com (123.6.2.61), 30 hops max, 60 byte packets 1 172.17.0.1 0.07 ms * 局域网 2 147.135.44.252 0.72 ms AS16276 美国 俄勒冈州 希尔斯伯勒 ovh.com 3 10.23.137.189 0.25 ms * 局域网 4 10.244.17.20 0.68 ms * 局域网 5 10.244.72.12 0.31 ms * 局域网 6 10.244.120.68 1.05 ms * 局域网 7 pao-sv8-bb1-a9.ca.us (142.44.208.8) 17.24 ms AS16276 美国 加利福尼亚州 帕洛阿尔托 ovh.com 8 * 9 sjo-b21-link.telia.net (62.115.125.1) 18.30 ms AS1299 美国 加利福尼亚州 圣何塞 telia.com 10 chinaunicom-ic-141282-sjo-b21.c.telia.net (213.248.71.90) 234.61 ms AS1299 美国 加利福尼亚州 圣何塞 telia.com 11 219.158.96.41 234.76 ms AS4837 中国 北京 联通 12 219.158.3.133 231.15 ms AS4837 中国 北京 联通 13 219.158.5.145 235.41 ms AS4837 中国 北京 联通 14 219.158.108.130 256.64 ms AS4837 中国 广西 南宁 联通 15 pc238.zz.ha.cn (61.168.27.238) 244.77 ms AS4837 中国 河南 郑州 联通 16 hn.kd.ny.adsl (42.236.1.134) 244.16 ms AS4837 中国 河南 郑州 联通 17 * 18 * 19 hn.kd.ny.adsl (123.6.2.61) 246.02 ms AS4837 中国 河南 郑州 联通 移动回程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 root@0f35ba2a2e97:~# ./besttrace -q 1 10086.cn traceroute to 10086.cn (117.136.190.162), 30 hops max, 60 byte packets 1 172.17.0.1 0.14 ms * 局域网 2 147.135.44.252 0.79 ms AS16276 美国 俄勒冈州 希尔斯伯勒 ovh.com 3 10.23.137.188 0.32 ms * 局域网 4 10.244.17.18 0.65 ms * 局域网 5 10.244.72.14 0.25 ms * 局域网 6 10.244.120.66 1.46 ms * 局域网 7 10.244.120.65 0.91 ms * 局域网 8 pao-sv8-bb1-a9.ca.us (142.44.208.8) 17.13 ms AS16276 美国 加利福尼亚州 帕洛阿尔托 ovh.com 9 be100-1368.sjo-sv5-bb1-a9.ca.us (178.32.135.159) 17.60 ms AS16276 美国 加利福尼亚州 圣何塞 ovh.com 10 eqix-ix-sv1.chinamobile.com (206.223.116.118) 17.95 ms AS701 美国 加利福尼亚州 圣何塞 equinix.com 11 223.120.6.69 17.80 ms AS58453 美国 加利福尼亚州 圣何塞 移动 12 223.120.12.26 186.02 ms AS58453 中国 上海 移动 13 221.183.55.30 186.27 ms AS9808 中国 上海 移动 14 221.183.25.189 200.41 ms AS9808 中国 上海 移动 15 * 16 221.176.21.85 265.03 ms AS9808 中国 北京 移动 17 221.183.54.238 316.98 ms AS9808 中国 北京 移动 ","permalink":"https://blog.curlc.com/archives/643/","summary":"\u003cp\u003e黑5上手的一台机器，网络为 500Mbps。\n具体位置：  美国 俄勒冈州 希尔斯伯勒\u003c/p\u003e\n\u003ch2 id=\"基础测试\"\u003e基础测试\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e60\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e--------------------------------------------------------------------------\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eCPU\u003c/span\u003e \u003cspan class=\"err\"\u003e型号\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eIntel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eR\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eXeon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eR\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eCPU\u003c/span\u003e \u003cspan class=\"n\"\u003eE3\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1270\u003c/span\u003e \u003cspan class=\"n\"\u003ev6\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.80\u003c/span\u003e\u003cspan class=\"n\"\u003eGHz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eCPU\u003c/span\u003e \u003cspan class=\"err\"\u003e核心数\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eCPU\u003c/span\u003e \u003cspan class=\"err\"\u003e频率\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e4000.854\u003c/span\u003e \u003cspan class=\"n\"\u003eMHz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e总硬盘大小\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e7372.9\u003c/span\u003e \u003cspan class=\"n\"\u003eGB\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e14.6\u003c/span\u003e \u003cspan class=\"n\"\u003eGB\u003c/span\u003e \u003cspan class=\"n\"\u003eUsed\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e总内存大小\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e31859\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e775\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e \u003cspan class=\"n\"\u003eUsed\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSWAP大小\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1021\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e \u003cspan class=\"n\"\u003eUsed\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e开机时长\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"n\"\u003edays\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e14\u003c/span\u003e \u003cspan class=\"n\"\u003ehour\u003c/span\u003e \u003cspan class=\"mi\"\u003e34\u003c/span\u003e \u003cspan class=\"nb\"\u003emin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e系统负载\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.15\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.03\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.01\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e系统\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDebian\u003c/span\u003e \u003cspan class=\"n\"\u003eGNU\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eLinux\u003c/span\u003e \u003cspan class=\"mi\"\u003e9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e架构\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ex86_64\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e64\u003c/span\u003e \u003cspan class=\"n\"\u003eBit\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e内核\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e4.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e041108\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003egeneric\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e虚拟化平台\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eNo\u003c/span\u003e \u003cspan class=\"n\"\u003eVirt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e--------------------------------------------------------------------------\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e硬盘\u003c/span\u003e\u003cspan class=\"n\"\u003eI\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eO\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e第一次测试\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e290\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e硬盘\u003c/span\u003e\u003cspan class=\"n\"\u003eI\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eO\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e第二次测试\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e288\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e硬盘\u003c/span\u003e\u003cspan class=\"n\"\u003eI\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eO\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e第三次测试\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e305\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e--------------------------------------------------------------------------\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e节点名称\u003c/span\u003e \u003cspan class=\"n\"\u003eIP地址\u003c/span\u003e \u003cspan class=\"err\"\u003e下载速度\u003c/span\u003e \u003cspan class=\"err\"\u003e延迟\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eCacheFly\u003c/span\u003e \u003cspan class=\"mf\"\u003e205.234\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e175.175\u003c/span\u003e \u003cspan class=\"mf\"\u003e38.8\u003c/span\u003e\u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e62.435\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eLinode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTokyo\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eJP\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eLinode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSingapore\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSG\u003c/span\u003e \u003cspan class=\"mf\"\u003e139.162\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e23.4\u003c/span\u003e \u003cspan class=\"mf\"\u003e11.0\u003c/span\u003e\u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e202.753\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eLinode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eLondon\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eUK\u003c/span\u003e \u003cspan class=\"mf\"\u003e176.58\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e107.39\u003c/span\u003e \u003cspan class=\"mf\"\u003e17.0\u003c/span\u003e\u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e146.624\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eLinode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFrankfurt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eDE\u003c/span\u003e \u003cspan class=\"mf\"\u003e139.162\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e130.8\u003c/span\u003e \u003cspan class=\"mf\"\u003e15.8\u003c/span\u003e\u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e149.624\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eLinode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFremont\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eCA\u003c/span\u003e \u003cspan class=\"mf\"\u003e50.116\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e14.9\u003c/span\u003e \u003cspan class=\"mf\"\u003e99.4\u003c/span\u003e\u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e25.793\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSoftlayer\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eDallas\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTX\u003c/span\u003e \u003cspan class=\"mf\"\u003e173.192\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e68.18\u003c/span\u003e \u003cspan class=\"mf\"\u003e25.0\u003c/span\u003e\u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e64.434\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSoftlayer\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSeattle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eWA\u003c/span\u003e \u003cspan class=\"mf\"\u003e67.228\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e112.250\u003c/span\u003e \u003cspan class=\"mf\"\u003e26.9\u003c/span\u003e\u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e59.743\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSoftlayer\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eFrankfurt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eDE\u003c/span\u003e \u003cspan class=\"mf\"\u003e159.122\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e69.4\u003c/span\u003e \u003cspan class=\"mf\"\u003e17.5\u003c/span\u003e\u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e145.023\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSoftlayer\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSingapore\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSG\u003c/span\u003e \u003cspan class=\"mf\"\u003e119.81\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e28.170\u003c/span\u003e \u003cspan class=\"mf\"\u003e7.49\u003c/span\u003e\u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e229.720\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSoftlayer\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eHongKong\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eCN\u003c/span\u003e \u003cspan class=\"mf\"\u003e119.81\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e130.170\u003c/span\u003e \u003cspan class=\"mf\"\u003e8.68\u003c/span\u003e\u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e205.621\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e--------------------------------------------------------------------------\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e节点名称\u003c/span\u003e \u003cspan class=\"err\"\u003e上传速度\u003c/span\u003e \u003cspan class=\"err\"\u003e下载速度\u003c/span\u003e \u003cspan class=\"err\"\u003e延迟\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e西安电信\u003c/span\u003e \u003cspan class=\"mf\"\u003e7.18\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e56.44\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e386.264\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e北京联通\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.70\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e6.97\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e545.524\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e--------------------------------------------------------------------------\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e合肥\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e269.5\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e北京\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e284.4\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e武汉\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e250.65\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e昌吉\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e \u003cspan class=\"err\"\u003e成都\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e \u003cspan class=\"err\"\u003e上海\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e太原\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e26.75\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e杭州\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e266.23\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e宁夏\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e259.12\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e呼和浩特\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e276.83\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e南昌\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e \u003cspan class=\"err\"\u003e拉萨\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e乌鲁木齐\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e342.9\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e天津\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e256.98\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e襄阳\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e郑州\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e248.19\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e沈阳\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e \u003cspan class=\"err\"\u003e兰州\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e280.55\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e哈尔滨\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e \u003cspan class=\"err\"\u003e宁波\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e \u003cspan class=\"err\"\u003e苏州\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e济南\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e266.44\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e西安\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e272.7\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e西宁\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e重庆\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e290.53\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e深圳\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e \u003cspan class=\"err\"\u003e南京\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e长沙\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eFail\u003c/span\u003e \u003cspan class=\"err\"\u003e长春\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e251.61\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e \u003cspan class=\"err\"\u003e福州\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e266.7\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e--------------------------------------------------------------------------\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"ne\"\u003eNode\u003c/span\u003e \u003cspan class=\"n\"\u003eName\u003c/span\u003e \u003cspan class=\"n\"\u003eUpload\u003c/span\u003e \u003cspan class=\"n\"\u003eSpeed\u003c/span\u003e \u003cspan class=\"n\"\u003eDownload\u003c/span\u003e \u003cspan class=\"n\"\u003eSpeed\u003c/span\u003e \u003cspan class=\"n\"\u003eLatency\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSpeedtest\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enet\u003c/span\u003e \u003cspan class=\"mf\"\u003e220.71\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e324.46\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"mf\"\u003e94.414\u003c/span\u003e \u003cspan class=\"n\"\u003ems\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eFast\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecom\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.00\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e193.9\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eBeijing\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e \u003cspan class=\"n\"\u003eCT\u003c/span\u003e \u003cspan class=\"mf\"\u003e15.31\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e10.29\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eNanjing\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e \u003cspan class=\"n\"\u003eCT\u003c/span\u003e \u003cspan class=\"mf\"\u003e13.36\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e69.16\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eHefei\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e \u003cspan class=\"n\"\u003eCT\u003c/span\u003e \u003cspan class=\"mf\"\u003e12.75\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e74.79\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eTianJin\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e \u003cspan class=\"n\"\u003eCU\u003c/span\u003e \u003cspan class=\"mf\"\u003e17.55\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e90.03\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eShanghai\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e \u003cspan class=\"n\"\u003eCU\u003c/span\u003e \u003cspan class=\"mf\"\u003e18.51\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e33.72\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eGuangzhou\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e \u003cspan class=\"n\"\u003eCU\u003c/span\u003e \u003cspan class=\"mf\"\u003e13.88\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e58.99\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eTianjin\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e \u003cspan class=\"n\"\u003eCM\u003c/span\u003e \u003cspan class=\"mf\"\u003e14.85\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e50.37\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eWuxi\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e \u003cspan class=\"n\"\u003eCM\u003c/span\u003e \u003cspan class=\"mf\"\u003e7.29\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e20.44\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eNanjing\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e \u003cspan class=\"n\"\u003eCM\u003c/span\u003e \u003cspan class=\"mf\"\u003e10.88\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e97.14\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eHefei\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e \u003cspan class=\"n\"\u003eCM\u003c/span\u003e \u003cspan class=\"mf\"\u003e50.01\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e9.86\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eChangsha\u003c/span\u003e \u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e \u003cspan class=\"n\"\u003eCM\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.28\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"mf\"\u003e584.95\u003c/span\u003e \u003cspan class=\"n\"\u003eMbit\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \u003c/p\u003e","title":"OVH美西杜甫测试"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 ---------------------------------------------------------------------- Superbench.sh -- https://www.oldking.net/350.html Mode : Standard Version : 1.1.6 Usage : wget -qO- git.io/superbench.sh | bash ---------------------------------------------------------------------- CPU Model : Intel(R) Xeon(R) CPU E5-1630 v4 @ 3.70GHz CPU Cores : 8 Cores 1199.999 MHz x86_64 CPU Cache : 10240 KB OS : CentOS 7.7.1908 (64 Bit) Dedicated Kernel : 4.14.129-bbrplus Total Space : 6.9 GB / 6853.5 GB Total RAM : 811 MB / 64312 MB (7156 MB Buff) Total SWAP : 0 MB / 2043 MB Uptime : 20 days 21 hour 22 min Load Average : 0.00, 0.00, 0.00 TCP CC : bbrplus ASN \u0026amp; ISP : AS16276, OVH SAS Organization : OVH SAS Location : Gravelines, France / FR Region : Hauts-de-France ---------------------------------------------------------------------- I/O Speed( 1.0GB ) : 174 MB/s I/O Speed( 1.0GB ) : 172 MB/s I/O Speed( 1.0GB ) : 176 MB/s Average I/O Speed : 174.0 MB/s ---------------------------------------------------------------------- Node Name Upload Speed Download Speed Latency Speedtest.net 560.40 Mbit/s 930.90 Mbit/s 6.504 ms Fast.com 0.00 Mbit/s 208.3 Mbit/s - Beijing 5G CT 4.54 Mbit/s 29.95 Mbit/s - Nanjing 5G CT 2.63 Mbit/s 43.83 Mbit/s - Hefei 5G CT 3.59 Mbit/s 29.56 Mbit/s - Guangzhou 5G CT 1.77 Mbit/s 11.32 Mbit/s - TianJin 5G CU 19.67 Mbit/s 56.32 Mbit/s - Shanghai 5G CU 3.70 Mbit/s 14.34 Mbit/s - Guangzhou 5G CU 2.93 Mbit/s 9.16 Mbit/s - Tianjin 5G CM 7.63 Mbit/s 24.87 Mbit/s - Wuxi 5G CM 2.56 Mbit/s 9.42 Mbit/s - Nanjing 5G CM 4.60 Mbit/s 30.01 Mbit/s - Changsha 5G CM 5.96 Mbit/s 363.09 Mbit/s - ---------------------------------------------------------------------- Finished in : 6 min 19 sec Timestamp : 2019-12-28 17:37:47 GMT+8 Results : /root/superbench.log ---------------------------------------------------------------------- Share result: · http://www.speedtest.net/result/8894382211.png · https://paste.ubuntu.com./p/dmt9Dj3r8m/ ---------------------------------------------------------------------- ","permalink":"https://blog.curlc.com/archives/657/","summary":"\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Superbench.sh -- https://www.oldking.net/350.html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Mode  : Standard    Version : 1.1.6\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Usage : wget -qO- git.io/superbench.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Model            : Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-1630 v4 @ 3.70GHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Cores            : \u003cspan class=\"m\"\u003e8\u003c/span\u003e Cores 1199.999 MHz x86_64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Cache            : \u003cspan class=\"m\"\u003e10240\u003c/span\u003e KB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e OS                   : CentOS 7.7.1908 \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e64\u003c/span\u003e Bit\u003cspan class=\"o\"\u003e)\u003c/span\u003e Dedicated\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Kernel               : 4.14.129-bbrplus\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total Space          : 6.9 GB / 6853.5 GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total RAM            : \u003cspan class=\"m\"\u003e811\u003c/span\u003e MB / \u003cspan class=\"m\"\u003e64312\u003c/span\u003e MB \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e7156\u003c/span\u003e MB Buff\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total SWAP           : \u003cspan class=\"m\"\u003e0\u003c/span\u003e MB / \u003cspan class=\"m\"\u003e2043\u003c/span\u003e MB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Uptime               : \u003cspan class=\"m\"\u003e20\u003c/span\u003e days \u003cspan class=\"m\"\u003e21\u003c/span\u003e hour \u003cspan class=\"m\"\u003e22\u003c/span\u003e min\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Load Average         : 0.00, 0.00, 0.00\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e TCP CC               : bbrplus\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ASN \u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e ISP            : AS16276, OVH SAS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Organization         : OVH SAS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Location             : Gravelines, France / FR\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Region               : Hauts-de-France\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e174\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e172\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e176\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Average I/O Speed    : 174.0 MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Node Name        Upload Speed      Download Speed      Latency\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Speedtest.net    560.40 Mbit/s     930.90 Mbit/s       6.504 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Fast.com         0.00 Mbit/s       208.3 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Beijing 5G   CT  4.54 Mbit/s       29.95 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Nanjing 5G   CT  2.63 Mbit/s       43.83 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Hefei 5G     CT  3.59 Mbit/s       29.56 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Guangzhou 5G CT  1.77 Mbit/s       11.32 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e TianJin 5G   CU  19.67 Mbit/s      56.32 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Shanghai 5G  CU  3.70 Mbit/s       14.34 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Guangzhou 5G CU  2.93 Mbit/s       9.16 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Tianjin 5G   CM  7.63 Mbit/s       24.87 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Wuxi 5G      CM  2.56 Mbit/s       9.42 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Nanjing 5G   CM  4.60 Mbit/s       30.01 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Changsha 5G  CM  5.96 Mbit/s       363.09 Mbit/s       -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Finished in  : \u003cspan class=\"m\"\u003e6\u003c/span\u003e min \u003cspan class=\"m\"\u003e19\u003c/span\u003e sec\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Timestamp    : 2019-12-28 17:37:47 GMT+8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Results      : /root/superbench.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Share result:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e · http://www.speedtest.net/result/8894382211.png\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e · https://paste.ubuntu.com./p/dmt9Dj3r8m/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"OVH黑五49.9欧(法国)机器基础测试"},{"content":"以前的Office 365开发者试用订阅（简称E3）有效期只有一年，一年过后数据都没了。\n现在微软推出的新版订阅有效时间位90天，可自动进行订阅 官方教程(手动复制打开)：https://docs.microsoft.com/en-us/office/developer-program/office-365-developer-program\n自动续订教程: https://blog.curlc.com/archives/687.html\n1、加入Office 365开发人员计划 https://developer.microsoft.com/zh-cn/office/dev-program\n2、右上角Microsoft帐户或启用Azure Active Directory的电子邮件登录 3、登录后填写国家和地区 填写基本信息 4、创建订阅 需要注意的是，这里选择的国家很重要\n，关系到你的onedrive数据等存储位置。比如我选择US，那么我的数据就是放在美国的微软数据中心。 下面张图中的“域名”弄错了，因该是 “域”,可随意填写 填写手机号进行验证\n这样就注册好了，接下来需要对自己的账号添加许可证\n，不然用不了的。 5、添加许可证 点击上图的 Go to subscription ，进入后台 管理 - \u0026gt; 用户 -\u0026gt; 活跃用户 -\u0026gt; 点击用户名 -\u0026gt; 许可证和用户 ,添加好后点击应用就可以了 6、自动订阅 (保活) 待完善\u0026hellip;\u0026hellip;\n目前仅仅使用onedrive api就能保活(前提是必须要自己创建的api key)，所以使用oneindex程序就可以了。但实际上还是需要outlook api，等失效了再补上。\n2020-01-21:\n经测试，当调用outlook的api后的第二天就会进行续期，如果在到期前20-30天调用，那么会提前续期。\n2020-02-22:\n正常情况一般是在到期前20-30天微软才会续期(前提是调用api)。\n如果没有调用，那么在 1 - 20 天以内调用api也会进行续期，大概在1-3天以内吧，只是现在只调一次好像也不行了，貌似有频率，达到标准后才会进行续期。\n2020-02-24:\n对于已过期但未删除的订阅，我测试连续调用3天后会进行续期。\n自动订阅程序会在本周日(2020-03-01)之前上线。\n2020-03-01:\n大家稍等，马上完成了~\n23:49\n刚好卡在最后10分钟完成了，因为在部署的时候遇到个奇怪的bug，所以\u0026hellip;\u0026hellip;\n自动续订教程: https://blog.curlc.com/archives/687.html\n","permalink":"https://blog.curlc.com/archives/599/","summary":"\u003cp\u003e以前的Office 365开发者试用订阅（简称E3）有效期只有一年，一年过后数据都没了。\u003c/p\u003e\n\u003ch4 id=\"现在微软推出的新版订阅有效时间位90天可自动进行订阅\"\u003e现在微软推出的新版订阅有效时间位90天，可自动进行订阅\u003c/h4\u003e\n\u003cp\u003e官方教程(手动复制打开)：https://docs.microsoft.com/en-us/office/developer-program/office-365-developer-program\u003c/p\u003e\n\u003cp\u003e自动续订教程: \u003ca href=\"https://blog.curlc.com/archives/687.html\"\u003ehttps://blog.curlc.com/archives/687.html\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"1加入office-365开发人员计划\"\u003e1、加入Office 365开发人员计划\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://developer.microsoft.com/zh-cn/office/dev-program\"\u003ehttps://developer.microsoft.com/zh-cn/office/dev-program\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/09/03/image.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"2右上角microsoft帐户或启用azure-active-directory的电子邮件登录\"\u003e2、右上角Microsoft帐户或启用Azure Active Directory的电子邮件登录\u003c/h2\u003e\n\u003ch2 id=\"3登录后填写国家和地区\"\u003e3、登录后填写国家和地区\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/09/03/imageedbe8db0327873b9.png\"\u003e\u003c/p\u003e\n\u003cp\u003e填写基本信息\n\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/09/03/image1623ca434117bd93.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"4创建订阅\"\u003e4、创建订阅\u003c/h2\u003e\n\u003cp\u003e需要注意的是，这里选择的国家很重要\u003c/p\u003e\n\u003cp\u003e，关系到你的onedrive数据等存储位置。比如我选择US，那么我的数据就是放在美国的微软数据中心。\n下面张图中的“域名”弄错了，因该是 “域”,可随意填写\n\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/09/03/image92c673ed4c96901c.png\"\u003e\u003c/p\u003e\n\u003cp\u003e填写手机号进行验证\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/09/03/image86b240156625f096.png\"\u003e\u003c/p\u003e\n\u003cp\u003e这样就注册好了，接下来需要对自己的账号添加许可证\u003c/p\u003e\n\u003cp\u003e，不然用不了的。\n\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/09/03/image54f54756a5da073c.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"5添加许可证\"\u003e5、添加许可证\u003c/h2\u003e\n\u003cp\u003e点击上图的 Go to subscription ，进入后台\n管理 - \u0026gt; 用户 -\u0026gt; 活跃用户 -\u0026gt; 点击用户名 -\u0026gt; 许可证和用户 ,添加好后点击应用就可以了\n\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/09/03/image891fa3cb64edc5ea.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2021/09/03/image6c2feb0ca634b139.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"6自动订阅-保活\"\u003e6、自动订阅 (保活)\u003c/h2\u003e\n\u003cp\u003e待完善\u0026hellip;\u0026hellip;\u003cbr\u003e\n目前仅仅使用onedrive api就能保活(前提是必须要自己创建的api key)，所以使用oneindex程序就可以了。但实际上还是需要outlook api，等失效了再补上。\u003cbr\u003e\n2020-01-21:\u003cbr\u003e\n经测试，当调用outlook的api后的第二天就会进行续期，如果在到期前20-30天调用，那么会提前续期。\u003cbr\u003e\n2020-02-22:\u003cbr\u003e\n正常情况一般是在到期前20-30天微软才会续期(前提是调用api)。\u003cbr\u003e\n如果没有调用，那么在 1 - 20 天以内调用api也会进行续期，大概在1-3天以内吧，只是现在只调一次好像也不行了，貌似有频率，达到标准后才会进行续期。\u003cbr\u003e\n2020-02-24:\u003cbr\u003e\n对于已过期但未删除的订阅，我测试连续调用3天后会进行续期。\u003cbr\u003e\n自动订阅程序会在本周日(2020-03-01)之前上线。\u003cbr\u003e\n2020-03-01:\u003cbr\u003e\n大家稍等，马上完成了~\u003cbr\u003e\n23:49\u003cbr\u003e\n刚好卡在最后10分钟完成了，因为在部署的时候遇到个奇怪的bug，所以\u0026hellip;\u0026hellip;\u003cbr\u003e\n自动续订教程: \u003ca href=\"https://blog.curlc.com/archives/687.html\"\u003ehttps://blog.curlc.com/archives/687.html\u003c/a\u003e\u003c/p\u003e","title":"新版可续签的Office 365开发者试用订阅！E5(附自动续订的方法)"},{"content":"DOcker：新的联网功能允许您按容器的名称连接到容器，因此，如果创建一个新网络，则连接到该网络的任何容器都可以通过其名称访问其他容器。：\n1）创建新网络 1 docker network create \u0026lt;network-name\u0026gt; 2）将容器连接到网络 1 docker run --net=\u0026lt;network-name\u0026gt; ... 或者将已存在容器加入新的网络\n1 docker network connect \u0026lt;network-name\u0026gt; \u0026lt;container-name\u0026gt; 3）按名称ping容器 1 docker exec -ti \u0026lt;container-name-A\u0026gt; ping \u0026lt;container-name-B\u0026gt; Ps：需要注意的是，如果容器没有指定名称(\u0026ndash;name)，那么就只能用id。\n1 2 3 4 64 bytes from c1 (172.18.0.4): icmp_seq=1 ttl=64 time=0.137 ms 64 bytes from c1 (172.18.0.4): icmp_seq=2 ttl=64 time=0.073 ms 64 bytes from c1 (172.18.0.4): icmp_seq=3 ttl=64 time=0.074 ms 64 bytes from c1 (172.18.0.4): icmp_seq=4 ttl=64 time=0.074 ms 请参阅文档的此部分；\n注意：与旧版本不同links，新网络将不会创建环境变量，也不会与其他容器共享环境变量。\n此功能当前不支持别名\n4）断开默认容器网络 由于容器仍然连接着默认bridge docker0，而现在我们已经不需要它，所以应该将容器与docker0的连接断开，执行以下操作：\n1 2 3 # 断开容器与docker0的连接 docker network disconnect bridge name1 docker network disconnect bridge name2 docker network 文档：https://docs.docker.com/network/\n参考文章：\nhttps://stackoverflow.com/questions/30545023/how-to-communicate-between-docker-containers-via-hostname/30550990 https://juejin.im/post/5ce26cb9f265da1bcd37aa7c ","permalink":"https://blog.curlc.com/archives/618/","summary":"\u003cp\u003eDOcker：新的联网功能允许您按容器的名称连接到容器，因此，如果创建一个新网络，则连接到该网络的任何容器都可以通过其名称访问其他容器。：\u003c/p\u003e\n\u003ch3 id=\"1创建新网络\"\u003e1）创建新网络\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e docker network create \u0026lt;network-name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch3 id=\"2将容器连接到网络\"\u003e2）将容器连接到网络\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run --net=\u0026lt;network-name\u0026gt; ...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e或者将已存在容器加入新的网络\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker network connect \u0026lt;network-name\u0026gt; \u0026lt;container-name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \u003c/p\u003e\n\u003ch3 id=\"3按名称ping容器\"\u003e3）按名称ping容器\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker exec -ti \u0026lt;container-name-A\u0026gt; ping \u0026lt;container-name-B\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003ePs：需要注意的是，如果容器\u003cstrong\u003e没有指定名称\u003c/strong\u003e(\u0026ndash;name)，那么就只能用id。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e64 bytes from c1 (172.18.0.4): icmp_seq=1 ttl=64 time=0.137 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e64 bytes from c1 (172.18.0.4): icmp_seq=2 ttl=64 time=0.073 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e64 bytes from c1 (172.18.0.4): icmp_seq=3 ttl=64 time=0.074 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e64 bytes from c1 (172.18.0.4): icmp_seq=4 ttl=64 time=0.074 ms\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e请参阅\u003ca href=\"https://docs.docker.com/network/\"\u003e文档\u003c/a\u003e的此部分；\u003cbr\u003e\n注意：与旧版本不同links，新网络将不会创建环境变量，也不会与其他容器共享环境变量。\u003cbr\u003e\n此功能当前不支持别名\u003c/p\u003e","title":"Docker 容器之间通信方法"},{"content":"VeryNginx VeryNginx 是一个功能强大而对人类友好的 Nginx 扩展程序.可作为cc、waf防火墙使用。\n介绍 VeryNginx 基于 lua_nginx_module(openrestry) 开发，实现了高级的防火墙、访问统计和其他的一些功能。 集成在 Nginx 中运行，扩展了 Nginx 本身的功能，并提供了友好的 Web 交互界面。 VeryNginx在线实例 用户名 / 密码: verynginx / verynginx 详细配置说明见：VeryNginx Github WiKi\nNginx 运行状态分析 每秒请求数 响应时间 网络流量 网络连接数 自定义行为 VeryNginx 包含强大的自定义功能，可以做很多事情 自定义行为包含两部分， Matcher 和 Action 。 Matcher 用来对请求进行匹配， Action 为要执行的动作 这样的优势在于把所有的前置判断整合在Matcher里一起来实现了，使复杂(组合)规则的实现变成了可能\nMatcher 一个 Matcher 用来判断一个 Http 请求是否符合指定的条件， 一个 Matcher 可以包含一个或者多个约束条件，目前支持以下几种约束：\nClient IP Host UserAgent URI Referer Request Args 当一个请求没有违反 Matcher 中包含的全部条件时，即命中了这个 Matcher\nAction 每个 Action 会引用一个 Matcher ，当 Matcher 命中时， Action 会被执行 目前已经实现了以下 Action\nScheme Lock 将访问协议锁定为 Https 或者 Http Redirect 对请求进行重定向 URI Rewrite 对请求的 URI 进行内部重写 Browser Verify 通过set-cookies 和 js 验证客户端是否为浏览器，并拦截非浏览器流量。本功能可能会阻拦搜索引擎爬虫，建议仅在被攻击时开启，或者针对搜索引擎编写特别的规则。 Frequency Limit 访问频率限制 Filter(waf) 过滤器 因为 Matcher 可以对请求进行细致的匹配，所以结合 Filter Action，就可以实现一个高级的WAF，可以利用Matcher中所有的条件来对请求进行过滤，并返回指定状态码 VeryNginx 预置了常用的过滤规则，可以在一定程度上阻止常见的 SQL 注入、Git 及 SVN 文件泄露、目录遍历攻击，并拦截常见的扫描工具。 Backend 每个 Backend 会引用一个 Matcher ，当 Matcher 命中时， 请求会通过 Backend 进行处理 目前已经实现了以下 Backend\nProxy Pass 将请求反向代理到其它服务器 Static File 使用本地文件处理请求 访问统计 VeryNginx 可以统计网站每个URI的访问情况，包括每个URI的:\n总请求次数 各状态码次数 返回总字节数 每请求平均字节数 总响应时间 平均响应时间 并且可以按各种规则排序进行分析。 安装和使用说明 VeryNginx 基于 OpenResty[^openresty]，所以安装 VeryNginx 需要先安装好 OpenResty。不过并不用担心安装过程中可能的麻烦，VeryNginx 自身提供了脚本来进行安装工作。\n安装 VeryNginx 克隆 VeryNginx 仓库到本地, 然后进入仓库目录，执行以下命令\n1 python install.py install 即可一键安装 VeryNginx 和 以及依赖的 OpenResty\n想使用自己的 Nginx? VeryNginx 可以自动为你安装依赖的 OpenResty，通常情况下你没有必要再自己安装 OpenResty。 但如果你想要使用自己编译的 Nginx( OpenResty )，也是可以的。具体方法请阅读Wiki中的这篇说明:Use own nginx\n使用 编辑 Nginx 配置文件 这个配置文件在普通的 Nginx 配置文件基础上添加了三条 Include 指令来实现功能，分别为\ninclude /opt/verynginx/verynginx/nginx_conf/in_external.conf; include /opt/verynginx/verynginx/nginx_conf/in_http_block.conf; include /opt/verynginx/verynginx/nginx_conf/in_server_block.conf; (此文件可以让你访问到 VeryNginx的控制面板，在需要访问控制面板的地方加入这个文件) 以上三条指令分别放在 http 配置块外部，http 配置块内部，server 配置块内部（控制面板：需要访问的域名下）\n个人配置 include /opt/verynginx/verynginx/nginx_conf/in_external.conf; include /opt/verynginx/verynginx/nginx_conf/in_http_block.conf; 以上两个文件放入nginx.conf 文件中\n1 include /opt/verynginx/verynginx/nginx_conf/in_server_block.conf; 这个文件放入需要访问控制面板的 server配置中。 比如我想让 a.a.com 这个域名能访问verynginx的控制面板，那么在server中加入这个配置文件\n记得重载nginx的配置\n访问控制面板 http://ip/verynginx/index_zh.html\n待完善 ","permalink":"https://blog.curlc.com/archives/612/","summary":"\u003ch2 id=\"verynginx\"\u003eVeryNginx\u003c/h2\u003e\n\u003cp\u003eVeryNginx 是一个功能强大而对人类友好的 Nginx 扩展程序.可作为cc、waf防火墙使用。\u003c/p\u003e\n\u003ch2 id=\"介绍\"\u003e介绍\u003c/h2\u003e\n\u003cp\u003eVeryNginx 基于 \u003ccode\u003elua_nginx_module(openrestry)\u003c/code\u003e 开发，实现了高级的防火墙、访问统计和其他的一些功能。 集成在 Nginx 中运行，扩展了 Nginx 本身的功能，并提供了友好的 Web 交互界面。\n\u003ca href=\"http://alexazhou.xyz/vn/index.html\"\u003eVeryNginx在线实例\u003c/a\u003e\n用户名 / 密码: \u003cstrong\u003everynginx / verynginx\u003c/strong\u003e\n详细配置说明见：\u003ca href=\"https://github.com/alexazhou/VeryNginx/wiki/%E7%9B%AE%E5%BD%95\"\u003eVeryNginx Github WiKi\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"nginx-运行状态分析\"\u003eNginx 运行状态分析\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e每秒请求数\u003c/li\u003e\n\u003cli\u003e响应时间\u003c/li\u003e\n\u003cli\u003e网络流量\u003c/li\u003e\n\u003cli\u003e网络连接数\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ca href=\"https://camo.githubusercontent.com/6a1c4358a36f5242e54dbfd03312a766e151ddb2/687474703a2f2f7777322e73696e61696d672e636e2f6d773639302f33666364306564336a7731663137656e376f6331796a32307a30306f6c30776c2e6a7067\"\u003e\u003cimg alt=\"Nginx 运行状态\" loading=\"lazy\" src=\"https://camo.githubusercontent.com/6a1c4358a36f5242e54dbfd03312a766e151ddb2/687474703a2f2f7777322e73696e61696d672e636e2f6d773639302f33666364306564336a7731663137656e376f6331796a32307a30306f6c30776c2e6a7067\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"自定义行为\"\u003e\u003ca href=\"https://github.com/alexazhou/VeryNginx/blob/master/readme_zh.md#%E8%87%AA%E5%AE%9A%E4%B9%89%E8%A1%8C%E4%B8%BA\"\u003e\u003c/a\u003e自定义行为\u003c/h3\u003e\n\u003cp\u003eVeryNginx 包含强大的自定义功能，可以做很多事情\n自定义行为包含两部分， Matcher 和 Action 。 Matcher 用来对请求进行匹配， Action 为要执行的动作\n这样的优势在于把所有的前置判断整合在Matcher里一起来实现了，使复杂(组合)规则的实现变成了可能\u003c/p\u003e\n\u003ch4 id=\"matcher\"\u003e\u003ca href=\"https://github.com/alexazhou/VeryNginx/blob/master/readme_zh.md#matcher\"\u003e\u003c/a\u003eMatcher\u003c/h4\u003e\n\u003cp\u003e一个 Matcher 用来判断一个 Http 请求是否符合指定的条件， 一个 Matcher 可以包含一个或者多个约束条件，目前支持以下几种约束：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eClient IP\u003c/li\u003e\n\u003cli\u003eHost\u003c/li\u003e\n\u003cli\u003eUserAgent\u003c/li\u003e\n\u003cli\u003eURI\u003c/li\u003e\n\u003cli\u003eReferer\u003c/li\u003e\n\u003cli\u003eRequest Args\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e当一个请求没有违反 Matcher 中包含的全部条件时，即命中了这个 Matcher\u003c/p\u003e\n\u003ch4 id=\"action\"\u003e\u003ca href=\"https://github.com/alexazhou/VeryNginx/blob/master/readme_zh.md#action\"\u003e\u003c/a\u003eAction\u003c/h4\u003e\n\u003cp\u003e每个 Action 会引用一个 Matcher ，当 Matcher 命中时， Action 会被执行\n目前已经实现了以下 Action\u003c/p\u003e","title":"verynginx安装教程"},{"content":"网上看了几篇规则倒是可以，但是我的用户名是admin，和后台管理界面冲突了，显示404。以下是官方的rewrite。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #Chevereto: Disable access to sensitive files location ~* /(app|content|lib)/.*\\.(po|php|lock|sql)$ { deny all; } #Chevereto: CORS headers location ~* /.*\\.(ttf|ttc|otf|eot|woff|woff2|font.css|css|js) { add_header Access-Control-Allow-Origin \u0026#34;*\u0026#34;; } #Chevereto: Upload path for image content only and set 404 replacement location ^~ /images/ { location ~* (jpe?g|png|gif) { log_not_found off; error_page 404 /content/images/system/default/404.gif; } return 403; } #Chevereto: Pretty URLs location / { index index.php; try_files $uri $uri/ /index.php?$query_string; } In case you installed Chevereto in a sub folder, the rules should look like this(如果您将Chevereto安装在子文件夹中，则规则应如下所示：):\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #Chevereto: Disable access to sensitive files location ~* /sub/(app|content|lib)/.*\\.(po|php|lock|sql)$ { deny all; } #Chevereto: CORS headers location ~* /sub/.*\\.(ttf|ttc|otf|eot|woff|woff2|font.css|css|js) { add_header Access-Control-Allow-Origin \u0026#34;*\u0026#34;; } #Chevereto: Upload path for image content only and set 404 replacement location ^~ /sub/images/ { location ~* (jpe?g|png|gif) { log_not_found off; error_page 404 /sub/content/images/system/default/404.gif; } return 403; } #Chevereto: Pretty URLs location /sub/ { index index.php; try_files $uri $uri/ /sub/index.php?$query_string; } 原文：https://chevereto.com/community/threads/nginx-rewrite-rules.9295/\n","permalink":"https://blog.curlc.com/archives/613/","summary":"\u003cp\u003e网上看了几篇规则倒是可以，但是我的用户名是admin，和后台管理界面冲突了，显示404。以下是官方的rewrite。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#Chevereto: Disable access to sensitive files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e~*\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"err\"\u003e\\\u003c/span\u003e\u003cspan class=\"p\"\u003e.(\u003c/span\u003e\u003cspan class=\"n\"\u003epo\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003elock\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edeny\u003c/span\u003e \u003cspan class=\"n\"\u003eall\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#Chevereto: CORS headers\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e~*\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"err\"\u003e\\\u003c/span\u003e\u003cspan class=\"p\"\u003e.(\u003c/span\u003e\u003cspan class=\"n\"\u003ettf\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003ettc\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003eotf\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003eeot\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003ewoff\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003ewoff2\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003efont\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecss\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003ecss\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003ejs\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eadd_header\u003c/span\u003e \u003cspan class=\"n\"\u003eAccess\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eControl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eAllow\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eOrigin\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#Chevereto: Upload path for image content only and set 404 replacement\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e^~\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eimages\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e~*\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ejpe\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003eg\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003epng\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003egif\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003elog_not_found\u003c/span\u003e \u003cspan class=\"n\"\u003eoff\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eerror_page\u003c/span\u003e \u003cspan class=\"mi\"\u003e404\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eimages\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esystem\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"mf\"\u003e404.\u003c/span\u003e\u003cspan class=\"n\"\u003egif\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e403\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#Chevereto: Pretty URLs\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etry_files\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003euri\u003c/span\u003e \u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003euri\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003equery_string\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eIn case you installed Chevereto in a \u003cstrong\u003esub folder\u003c/strong\u003e, the rules should look like this(如果您将Chevereto安装在\u003cstrong\u003e子文件夹中\u003c/strong\u003e，则规则应如下所示：):\u003c/p\u003e","title":"chevereto nginx rewrite 规则"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 ---------------------------------------------------------------------- Superbench.sh -- https://www.oldking.net/350.html Mode : Standard Version : 1.1.6 Usage : wget -qO- git.io/superbench.sh | bash ---------------------------------------------------------------------- CPU Model : Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz CPU Cores : 4 Cores 1599.951 MHz x86_64 CPU Cache : 6144 KB OS : Debian GNU/Linux 9 (64 Bit) Dedicated Kernel : 4.9.0-11-amd64 Total Space : 1.7 GB / 1843.7 GB Total RAM : 297 MB / 15950 MB (1219 MB Buff) Total SWAP : 0 MB / 1022 MB Uptime : 1 days 1 hour 25 min Load Average : 0.21, 0.05, 0.02 TCP CC : bbr ASN \u0026amp; ISP : AS16276, OVH ISP Organization : OVH SAS Location : Roubaix, France / FR Region : Hauts-de-France ---------------------------------------------------------------------- I/O Speed( 1.0GB ) : 146 MB/s I/O Speed( 1.0GB ) : 149 MB/s I/O Speed( 1.0GB ) : 145 MB/s Average I/O Speed : 146.7 MB/s ---------------------------------------------------------------------- Node Name Upload Speed Download Speed Latency Speedtest.net 97.05 Mbit/s 92.86 Mbit/s 15.055 ms Fast.com 0.00 Mbit/s 53.2 Mbit/s - Beijing 5G CT 12.62 Mbit/s 8.84 Mbit/s - Nanjing 5G CT 9.84 Mbit/s 6.91 Mbit/s - Hefei 5G CT 8.43 Mbit/s 9.82 Mbit/s - Guangzhou 5G CT 3.13 Mbit/s 1.16 Mbit/s - TianJin 5G CU 19.46 Mbit/s 5.04 Mbit/s - Shanghai 5G CU 3.47 Mbit/s 4.01 Mbit/s - Guangzhou 5G CU 3.33 Mbit/s 3.10 Mbit/s - Tianjin 5G CM 13.29 Mbit/s 28.92 Mbit/s - Wuxi 5G CM 2.79 Mbit/s 4.29 Mbit/s - Nanjing 5G CM 5.69 Mbit/s 4.19 Mbit/s - Changsha 5G CM 8.95 Mbit/s 9.28 Mbit/s - ---------------------------------------------------------------------- Finished in : 6 min 10 sec Timestamp : 2019-12-28 17:24:31 GMT+8 Results : /root/superbench.log ---------------------------------------------------------------------- Share result: · http://www.speedtest.net/result/8894357995.png · https://paste.ubuntu.com./p/wdfMqWt8KJ/ ---------------------------------------------------------------------- ","permalink":"https://blog.curlc.com/archives/656/","summary":"\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Superbench.sh -- https://www.oldking.net/350.html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Mode  : Standard    Version : 1.1.6\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Usage : wget -qO- git.io/superbench.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Model            : Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Core\u003cspan class=\"o\"\u003e(\u003c/span\u003eTM\u003cspan class=\"o\"\u003e)\u003c/span\u003e i5-2400 CPU @ 3.10GHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Cores            : \u003cspan class=\"m\"\u003e4\u003c/span\u003e Cores 1599.951 MHz x86_64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Cache            : \u003cspan class=\"m\"\u003e6144\u003c/span\u003e KB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e OS                   : Debian GNU/Linux \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e64\u003c/span\u003e Bit\u003cspan class=\"o\"\u003e)\u003c/span\u003e Dedicated\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Kernel               : 4.9.0-11-amd64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total Space          : 1.7 GB / 1843.7 GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total RAM            : \u003cspan class=\"m\"\u003e297\u003c/span\u003e MB / \u003cspan class=\"m\"\u003e15950\u003c/span\u003e MB \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1219\u003c/span\u003e MB Buff\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total SWAP           : \u003cspan class=\"m\"\u003e0\u003c/span\u003e MB / \u003cspan class=\"m\"\u003e1022\u003c/span\u003e MB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Uptime               : \u003cspan class=\"m\"\u003e1\u003c/span\u003e days \u003cspan class=\"m\"\u003e1\u003c/span\u003e hour \u003cspan class=\"m\"\u003e25\u003c/span\u003e min\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Load Average         : 0.21, 0.05, 0.02\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e TCP CC               : bbr\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ASN \u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e ISP            : AS16276, OVH ISP\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Organization         : OVH SAS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Location             : Roubaix, France / FR\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Region               : Hauts-de-France\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e146\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e149\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e145\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Average I/O Speed    : 146.7 MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Node Name        Upload Speed      Download Speed      Latency\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Speedtest.net    97.05 Mbit/s      92.86 Mbit/s        15.055 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Fast.com         0.00 Mbit/s       53.2 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Beijing 5G   CT  12.62 Mbit/s      8.84 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Nanjing 5G   CT  9.84 Mbit/s       6.91 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Hefei 5G     CT  8.43 Mbit/s       9.82 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Guangzhou 5G CT  3.13 Mbit/s       1.16 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e TianJin 5G   CU  19.46 Mbit/s      5.04 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Shanghai 5G  CU  3.47 Mbit/s       4.01 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Guangzhou 5G CU  3.33 Mbit/s       3.10 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Tianjin 5G   CM  13.29 Mbit/s      28.92 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Wuxi 5G      CM  2.79 Mbit/s       4.29 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Nanjing 5G   CM  5.69 Mbit/s       4.19 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Changsha 5G  CM  8.95 Mbit/s       9.28 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Finished in  : \u003cspan class=\"m\"\u003e6\u003c/span\u003e min \u003cspan class=\"m\"\u003e10\u003c/span\u003e sec\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Timestamp    : 2019-12-28 17:24:31 GMT+8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Results      : /root/superbench.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Share result:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e · http://www.speedtest.net/result/8894357995.png\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e · https://paste.ubuntu.com./p/wdfMqWt8KJ/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"KS10 基础测试"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 ---------------------------------------------------------------------- Superbench.sh -- https://www.oldking.net/350.html Mode : Standard Version : 1.1.6 Usage : wget -qO- git.io/superbench.sh | bash ---------------------------------------------------------------------- CPU Model : Intel(R) Core(TM) i3-2130 CPU @ 3.40GHz CPU Cores : 4 Cores 1672.115 MHz x86_64 CPU Cache : 3072 KB OS : CentOS 7.7.1908 (64 Bit) Dedicated Kernel : 4.14.129-bbrplus Total Space : 8.4 GB / 1843.2 GB Total RAM : 1421 MB / 7875 MB (4847 MB Buff) Total SWAP : 303 MB / 2046 MB Uptime : 105 days 15 hour 1 min Load Average : 0.20, 0.17, 0.11 TCP CC : bbrplus ASN \u0026amp; ISP : AS16276, OVH SAS Organization : OVH Hosting, Inc. Location : Montreal, Canada / CA Region : Quebec ---------------------------------------------------------------------- I/O Speed( 1.0GB ) : 153 MB/s I/O Speed( 1.0GB ) : 154 MB/s I/O Speed( 1.0GB ) : 159 MB/s Average I/O Speed : 155.3 MB/s ---------------------------------------------------------------------- Node Name Upload Speed Download Speed Latency Speedtest.net 97.26 Mbit/s 93.23 Mbit/s 6.052 ms Fast.com 0.00 Mbit/s 93.6 Mbit/s - Beijing 5G CT 9.32 Mbit/s 29.70 Mbit/s - Nanjing 5G CT 20.71 Mbit/s 29.61 Mbit/s - Hefei 5G CT 7.68 Mbit/s 21.46 Mbit/s - Guangzhou 5G CT 0.85 Mbit/s 8.17 Mbit/s - TianJin 5G CU 13.29 Mbit/s 20.45 Mbit/s - Shanghai 5G CU 8.82 Mbit/s 23.73 Mbit/s - Guangzhou 5G CU 10.23 Mbit/s 25.83 Mbit/s - Tianjin 5G CM 6.77 Mbit/s 13.90 Mbit/s - Wuxi 5G CM 3.50 Mbit/s 10.39 Mbit/s - Nanjing 5G CM 5.56 Mbit/s 17.93 Mbit/s - Changsha 5G CM 1.96 Mbit/s 47.78 Mbit/s - ---------------------------------------------------------------------- Finished in : 7 min 4 sec Timestamp : 2019-12-28 17:22:38 GMT+8 Results : /root/superbench.log ---------------------------------------------------------------------- Share result: · http://www.speedtest.net/result/8894353677.png · https://paste.ubuntu.com./p/W5s7w5j9SB/ ---------------------------------------------------------------------- ","permalink":"https://blog.curlc.com/archives/655/","summary":"\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Superbench.sh -- https://www.oldking.net/350.html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Mode  : Standard    Version : 1.1.6\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Usage : wget -qO- git.io/superbench.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Model            : Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Core\u003cspan class=\"o\"\u003e(\u003c/span\u003eTM\u003cspan class=\"o\"\u003e)\u003c/span\u003e i3-2130 CPU @ 3.40GHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Cores            : \u003cspan class=\"m\"\u003e4\u003c/span\u003e Cores 1672.115 MHz x86_64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Cache            : \u003cspan class=\"m\"\u003e3072\u003c/span\u003e KB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e OS                   : CentOS 7.7.1908 \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e64\u003c/span\u003e Bit\u003cspan class=\"o\"\u003e)\u003c/span\u003e Dedicated\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Kernel               : 4.14.129-bbrplus\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total Space          : 8.4 GB / 1843.2 GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total RAM            : \u003cspan class=\"m\"\u003e1421\u003c/span\u003e MB / \u003cspan class=\"m\"\u003e7875\u003c/span\u003e MB \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e4847\u003c/span\u003e MB Buff\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total SWAP           : \u003cspan class=\"m\"\u003e303\u003c/span\u003e MB / \u003cspan class=\"m\"\u003e2046\u003c/span\u003e MB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Uptime               : \u003cspan class=\"m\"\u003e105\u003c/span\u003e days \u003cspan class=\"m\"\u003e15\u003c/span\u003e hour \u003cspan class=\"m\"\u003e1\u003c/span\u003e min\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Load Average         : 0.20, 0.17, 0.11\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e TCP CC               : bbrplus\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ASN \u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e ISP            : AS16276, OVH SAS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Organization         : OVH Hosting, Inc.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Location             : Montreal, Canada / CA\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Region               : Quebec\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e153\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e154\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e159\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Average I/O Speed    : 155.3 MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Node Name        Upload Speed      Download Speed      Latency\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Speedtest.net    97.26 Mbit/s      93.23 Mbit/s        6.052 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Fast.com         0.00 Mbit/s       93.6 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Beijing 5G   CT  9.32 Mbit/s       29.70 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Nanjing 5G   CT  20.71 Mbit/s      29.61 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Hefei 5G     CT  7.68 Mbit/s       21.46 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Guangzhou 5G CT  0.85 Mbit/s       8.17 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e TianJin 5G   CU  13.29 Mbit/s      20.45 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Shanghai 5G  CU  8.82 Mbit/s       23.73 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Guangzhou 5G CU  10.23 Mbit/s      25.83 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Tianjin 5G   CM  6.77 Mbit/s       13.90 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Wuxi 5G      CM  3.50 Mbit/s       10.39 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Nanjing 5G   CM  5.56 Mbit/s       17.93 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Changsha 5G  CM  1.96 Mbit/s       47.78 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Finished in  : \u003cspan class=\"m\"\u003e7\u003c/span\u003e min \u003cspan class=\"m\"\u003e4\u003c/span\u003e sec\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Timestamp    : 2019-12-28 17:22:38 GMT+8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Results      : /root/superbench.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Share result:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e · http://www.speedtest.net/result/8894353677.png\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e · https://paste.ubuntu.com./p/W5s7w5j9SB/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"KS7 基础测试"},{"content":" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 ---------------------------------------------------------------------- Superbench.sh -- https://www.oldking.net/350.html Mode : Standard Version : 1.1.6 Usage : wget -qO- git.io/superbench.sh | bash ---------------------------------------------------------------------- CPU Model : Intel(R) Celeron(R) CPU G3930 @ 2.90GHz CPU Cores : 2 Cores 2900.132 MHz x86_64 CPU Cache : 2048 KB OS : CentOS 7.7.1908 (64 Bit) Dedicated Kernel : 4.14.129-bbrplus Total Space : 496.1 GB / 1844.2 GB Total RAM : 857 MB / 7935 MB (5935 MB Buff) Total SWAP : 196 MB / 1023 MB Uptime : 120 days 20 hour 9 min Load Average : 0.04, 0.06, 0.01 TCP CC : bbrplus ASN \u0026amp; ISP : AS21409, Ikoula Ripe Organization : Location : Boulogne-Billancourt, France / FR Region : Île-de-France ---------------------------------------------------------------------- I/O Speed( 1.0GB ) : 177 MB/s I/O Speed( 1.0GB ) : 180 MB/s I/O Speed( 1.0GB ) : 186 MB/s Average I/O Speed : 181.0 MB/s ---------------------------------------------------------------------- Node Name Upload Speed Download Speed Latency Speedtest.net 776.17 Mbit/s 865.04 Mbit/s 9.314 ms Fast.com 0.00 Mbit/s 154.9 Mbit/s - Beijing 5G CT 3.88 Mbit/s 58.06 Mbit/s - Nanjing 5G CT 7.71 Mbit/s 85.37 Mbit/s - Hefei 5G CT 4.14 Mbit/s 32.01 Mbit/s - Guangzhou 5G CT 2.73 Mbit/s 19.70 Mbit/s - TianJin 5G CU 60.37 Mbit/s 89.34 Mbit/s - Shanghai 5G CU 3.52 Mbit/s 12.35 Mbit/s - Guangzhou 5G CU 3.17 Mbit/s 20.52 Mbit/s - Tianjin 5G CM 12.40 Mbit/s 50.79 Mbit/s - Wuxi 5G CM 0.23 Mbit/s 0.19 Mbit/s - Nanjing 5G CM 5.03 Mbit/s 24.05 Mbit/s - Changsha 5G CM 9.78 Mbit/s 336.54 Mbit/s - ---------------------------------------------------------------------- Finished in : 6 min 20 sec Timestamp : 2019-12-28 17:16:02 GMT+8 Results : /root/superbench.log ---------------------------------------------------------------------- Share result: · http://www.speedtest.net/result/8894341158.png · https://paste.ubuntu.com./p/fZ4YMRWsfz/ ---------------------------------------------------------------------- ","permalink":"https://blog.curlc.com/archives/654/","summary":"\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Superbench.sh -- https://www.oldking.net/350.html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Mode  : Standard    Version : 1.1.6\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Usage : wget -qO- git.io/superbench.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Model            : Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Celeron\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU G3930 @ 2.90GHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Cores            : \u003cspan class=\"m\"\u003e2\u003c/span\u003e Cores 2900.132 MHz x86_64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e CPU Cache            : \u003cspan class=\"m\"\u003e2048\u003c/span\u003e KB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e OS                   : CentOS 7.7.1908 \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e64\u003c/span\u003e Bit\u003cspan class=\"o\"\u003e)\u003c/span\u003e Dedicated\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Kernel               : 4.14.129-bbrplus\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total Space          : 496.1 GB / 1844.2 GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total RAM            : \u003cspan class=\"m\"\u003e857\u003c/span\u003e MB / \u003cspan class=\"m\"\u003e7935\u003c/span\u003e MB \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e5935\u003c/span\u003e MB Buff\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Total SWAP           : \u003cspan class=\"m\"\u003e196\u003c/span\u003e MB / \u003cspan class=\"m\"\u003e1023\u003c/span\u003e MB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Uptime               : \u003cspan class=\"m\"\u003e120\u003c/span\u003e days \u003cspan class=\"m\"\u003e20\u003c/span\u003e hour \u003cspan class=\"m\"\u003e9\u003c/span\u003e min\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Load Average         : 0.04, 0.06, 0.01\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e TCP CC               : bbrplus\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ASN \u003cspan class=\"p\"\u003e\u0026amp;\u003c/span\u003e ISP            : AS21409, Ikoula Ripe\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Organization         :\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Location             : Boulogne-Billancourt, France / FR\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Region               : Île-de-France\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e177\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e180\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e I/O Speed\u003cspan class=\"o\"\u003e(\u003c/span\u003e 1.0GB \u003cspan class=\"o\"\u003e)\u003c/span\u003e   : \u003cspan class=\"m\"\u003e186\u003c/span\u003e MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Average I/O Speed    : 181.0 MB/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Node Name        Upload Speed      Download Speed      Latency\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Speedtest.net    776.17 Mbit/s     865.04 Mbit/s       9.314 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Fast.com         0.00 Mbit/s       154.9 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Beijing 5G   CT  3.88 Mbit/s       58.06 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Nanjing 5G   CT  7.71 Mbit/s       85.37 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Hefei 5G     CT  4.14 Mbit/s       32.01 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Guangzhou 5G CT  2.73 Mbit/s       19.70 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e TianJin 5G   CU  60.37 Mbit/s      89.34 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Shanghai 5G  CU  3.52 Mbit/s       12.35 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Guangzhou 5G CU  3.17 Mbit/s       20.52 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Tianjin 5G   CM  12.40 Mbit/s      50.79 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Wuxi 5G      CM  0.23 Mbit/s       0.19 Mbit/s         -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Nanjing 5G   CM  5.03 Mbit/s       24.05 Mbit/s        -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Changsha 5G  CM  9.78 Mbit/s       336.54 Mbit/s       -\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Finished in  : \u003cspan class=\"m\"\u003e6\u003c/span\u003e min \u003cspan class=\"m\"\u003e20\u003c/span\u003e sec\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Timestamp    : 2019-12-28 17:16:02 GMT+8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Results      : /root/superbench.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Share result:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e · http://www.speedtest.net/result/8894341158.png\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e · https://paste.ubuntu.com./p/fZ4YMRWsfz/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e----------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"ikoula 9.9欧特价机测试"},{"content":"背景 每次手机上搜资料时，只要进入了简书，那么必定会跳转到各种app(淘宝、京东、天猫、京东金融等等)，很烦的啊。\n2020-02-02 更新:\n在csdn、豆瓣上也发现这个问题。\n我还以为是我本地宽带或者dns劫持，但是我本地dns用的是114和119，很少出现这种问题，而且简书也是https，浏览器也是绿标，\n所以就usb chrome 远程调试看了下，不看不知道，居然会唤醒这么多app和跳转网页。\n临时解决方案 屏蔽 ad.lflucky.com 这个域名(建议屏蔽这个域名下的所有二级域名)，host改也行。 方法一: 手机端使用 火狐浏览器，安装 AdGuard 广告过滤插件，屏蔽 ad.lflucky.com 方法二、有位读者推荐的软件也很不错，AdGuard Home ，安装在软路由中使用~\n2020-03-09: 广告代码改为https://jian.t58b.com/js/jan/jian.js所以，继续屏蔽 jian.t58b.com\n最后想了下，既然是cdn劫持，那么我把cdn域名一刀切怎么样，别说，效果还蛮不错的，界面干净了。 屏蔽整个cdn下的js，不过这样带来的后果是文章不能动态加载出来，只适合偶尔使用简书。\n1 cdn2.jianshu.io/*.js 手机端用yandex浏览器，装广告屏蔽插件，屏蔽 ad.lflucky.com 这个域名(建议屏蔽这个域名下的所有二级域名)，我个人装的是广告终结者，本来想装uBlock的，懒得折腾就没装。或者路由器ad插件屏蔽这个域名。添加屏蔽域名后完美，终于不再跳转。\n分析 因为我的前端是废的，所以也只能进行简单点的分析，大佬们看看就好了。 简单分析了一下跳转js，点击 VM2486:1 进入到js，格式化后的代码如下\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 (function() { function getJson(a, b) { var c = new XMLHttpRequest(); c.open(\u0026#34;get\u0026#34;, a); c.send(null); c.onreadystatechange = function() { if (c.readyState == 4 \u0026amp;\u0026amp; c.status == 200) { b \u0026amp;\u0026amp; b(eval(\u0026#34;(\u0026#34; + c.responseText + \u0026#34;)\u0026#34;)) } } } function ProductLink(a) { this.product = a.productJson; this.disabledArea = [\u0026#34;UNITED STATES\u0026#34;, \u0026#34;JAPAN\u0026#34;, \u0026#34;SINGAPORE\u0026#34;, \u0026#34;CANADA\u0026#34;, \u0026#34;香港\u0026#34;, \u0026#34;北京\u0026#34;, \u0026#34;上海\u0026#34;]; this.avokeTime = a.avokeTime } ProductLink.prototype.init = function() { var b = this; if (window.navigator.platform.indexOf(\u0026#34;Win\u0026#34;) \u0026gt; -1 || window.navigator.platform.indexOf(\u0026#34;Mac\u0026#34;) \u0026gt; -1) {} else { this.isDisabled(function() { var a = true; try { for (var i = 0; i \u0026lt; b.disabledArea.length; i++) { if (returnCitySN[\u0026#34;cname\u0026#34;].indexOf(b.disabledArea[i]) \u0026gt; -1) { a = false; break } } } catch(e) {} if (!a) { return } b.addElement() }) } }; ProductLink.prototype.isDisabled = function(a) { var b = document.createElement(\u0026#34;script\u0026#34;); var c = false; document.body.appendChild(b); b.src = \u0026#34;https://pv.sohu.com/cityjson\u0026#34;; b.onload = function() { if (!c) { c = true; a \u0026amp;\u0026amp; a() } }; setTimeout(function() { if (!c) { c = true; a \u0026amp;\u0026amp; a() } }, 4000) }; ProductLink.prototype.addElement = function() { var a = this; setTimeout(function() { a.showMainProject(); a.showSecondaryProduct() }, 2000) }; ProductLink.prototype.showMainProject = function() { this.showAllKind(this.product.mainProduct.appLink, this.product.mainProduct.cancelTime) }; ProductLink.prototype.showSecondaryProduct = function() { var b = this; var c = this.product.secondaryProduct.concat(); var d = c.length; var e = null; e = setInterval(function() { if (d \u0026lt;= 0) { clearInterval(e); return } var a = Math.floor(Math.random() * d); b.showAllKind(c[a].appLink, c[a].cancelTime); c.splice(a, 1); d-- }, b.avokeTime * 1000) }; ProductLink.prototype.showAllKind = function(a, b) { var c = a.concat(); var d = c.length; var e = false; var f = this.getCurrentDate(); while (d \u0026gt; 0 \u0026amp;\u0026amp; !e) { var g = Math.floor(Math.random() * d); if (c[g].type == \u0026#34;random\u0026#34;) { this.newIframe(c[g].link, b); e = true } else if (c[g].type == \u0026#34;date\u0026#34;) { if (c[g][f]) { this.newIframe(c[g][f], b); e = true } else { c.splice(g, 1); d-- } } } }; ProductLink.prototype.getCurrentDate = function() { var a = new Date(), Y = a.getFullYear() + \u0026#34;-\u0026#34;, M = (a.getMonth() + 1 \u0026lt; 10 ? \u0026#34;0\u0026#34; + (a.getMonth() + 1) : a.getMonth() + 1) + \u0026#34;-\u0026#34;, D = a.getDate() \u0026lt; 10 ? \u0026#34;0\u0026#34; + a.getDate() : a.getDate(); return Y + M + D }; ProductLink.prototype.newIframe = function(b, c) { var d = document.createElement(\u0026#34;iframe\u0026#34;); d.style.display = \u0026#34;none\u0026#34;; d.src = b; document.body.appendChild(d); var e = document.createElement(\u0026#34;iframe\u0026#34;); e.style.display = \u0026#34;none\u0026#34;; e.src = \u0026#34;./counturl.html?url=\u0026#34; + encodeURIComponent(b); document.body.appendChild(e); setTimeout((function(m, a) { return function() { document.body.removeChild(m); document.body.removeChild(a) } })(d, e), c * 1000) }; getJson(\u0026#34;./json/product.json\u0026#34;, function(a) { new ProductLink(a).init() }) })(); 嗯，上面有个getJson方法，搜索了下加载记录发现域名是：\n1 https://ad.lflucky.com/janes/json/product.json（对应ip为：59.110.185.253） 阿里云的机器，很不错，考虑到个各种不同的宽带用户给予最佳的劫持体验\n。 Json内容如下(时间 2019-08-31 15:52 )：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 { \u0026#34;productJson\u0026#34;: { \u0026#34;mainProduct\u0026#34;: { \u0026#34;appName\u0026#34;: \u0026#34;tb\u0026#34;, \u0026#34;appLink\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;random\u0026#34;, \u0026#34;link\u0026#34;: \u0026#34;tbopen://m.taobao.com/tbopen/index.html?source=auto\u0026amp;action=ali.open.nav\u0026amp;module=h5\u0026amp;bootImage=0\u0026amp;spm=2014.ugdhh.4076930961.10016-1208-32768\u0026amp;bc_fl_src=growth_dhh_4076930961_10016-1208-32768\u0026amp;materialid=10016\u0026amp;h5Url=https://h5.m.taobao.com/bcec/dahanghai-jump.html?spm=2014.ugdhh.4076930961.10016-1208-32768\u0026amp;bc_fl_src=growth_dhh_4076930961_10016-1208-32768\u0026#34; } ], \u0026#34;cancelTime\u0026#34;: 5 }, \u0026#34;secondaryProduct\u0026#34;: [ { \u0026#34;appName\u0026#34;: \u0026#34;uc\u0026#34;, \u0026#34;appLink\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;date\u0026#34;, \u0026#34;2019-08-30\u0026#34;: \u0026#34;uclink://www.uc.cn/cc77796ca7c25dff9607d31b29effc07?action=open_url\u0026amp;src_pkg=jixinhx\u0026amp;src_ch=jixinhx64\u0026amp;src_scene=pullup\u0026amp;url=ext:info_flow_open_channel:ch_id=100\u0026amp;insert_item_ids=17707084109410804287\u0026amp;type=multiple\u0026amp;from=6001\u0026#34;, \u0026#34;2019-08-31\u0026#34;: \u0026#34;uclink://www.uc.cn/cc77796ca7c25dff9607d31b29effc07?action=open_url\u0026amp;src_pkg=jixinhx\u0026amp;src_ch=jixinhx64\u0026amp;src_scene=pullup\u0026amp;url=ext:info_flow_open_channel:ch_id=100\u0026amp;insert_item_ids=954127903094346666\u0026amp;type=multiple\u0026amp;from=6001\u0026#34;, \u0026#34;2019-09-01\u0026#34;: \u0026#34;uclink://www.uc.cn/cc77796ca7c25dff9607d31b29effc07?action=open_url\u0026amp;src_pkg=jixinhx\u0026amp;src_ch=jixinhx64\u0026amp;src_scene=pullup\u0026amp;url=ext:info_flow_open_channel:ch_id=100\u0026amp;insert_item_ids=954127903094346666\u0026amp;type=multiple\u0026amp;from=6001\u0026#34;, \u0026#34;2019-09-02\u0026#34;: \u0026#34;uclink://www.uc.cn/cc77796ca7c25dff9607d31b29effc07?action=open_url\u0026amp;src_pkg=jixinhx\u0026amp;src_ch=jixinhx64\u0026amp;src_scene=pullup\u0026amp;url=ext:info_flow_open_channel:ch_id=100\u0026amp;insert_item_ids=954127903094346666\u0026amp;type=multiple\u0026amp;from=6001\u0026#34;, \u0026#34;2019-09-03\u0026#34;: \u0026#34;uclink://www.uc.cn/cc77796ca7c25dff9607d31b29effc07?action=open_url\u0026amp;src_pkg=jixinhx\u0026amp;src_ch=jixinhx64\u0026amp;src_scene=pullup\u0026amp;url=ext:info_flow_open_channel:ch_id=100\u0026amp;insert_item_ids=5414198177651951323\u0026amp;type=multiple\u0026amp;from=6001\u0026#34;, \u0026#34;2019-09-04\u0026#34;: \u0026#34;uclink://www.uc.cn/cc77796ca7c25dff9607d31b29effc07?action=open_url\u0026amp;src_pkg=jixinhx\u0026amp;src_ch=jixinhx64\u0026amp;src_scene=pullup\u0026amp;url=ext:info_flow_open_channel:ch_id=100\u0026amp;insert_item_ids=5414198177651951323\u0026amp;type=multiple\u0026amp;from=6001\u0026#34;, \u0026#34;2019-09-05\u0026#34;: \u0026#34;uclink://www.uc.cn/cc77796ca7c25dff9607d31b29effc07?action=open_url\u0026amp;src_pkg=jixinhx\u0026amp;src_ch=jixinhx64\u0026amp;src_scene=pullup\u0026amp;url=ext:info_flow_open_channel:ch_id=100\u0026amp;insert_item_ids=1692900910150652661\u0026amp;type=multiple\u0026amp;from=6001\u0026#34;, \u0026#34;2019-09-06\u0026#34;: \u0026#34;uclink://www.uc.cn/cc77796ca7c25dff9607d31b29effc07?action=open_url\u0026amp;src_pkg=jixinhx\u0026amp;src_ch=jixinhx64\u0026amp;src_scene=pullup\u0026amp;url=ext:info_flow_open_channel:ch_id=100\u0026amp;insert_item_ids=1692900910150652661\u0026amp;type=multiple\u0026amp;from=6001\u0026#34; } ], \u0026#34;cancelTime\u0026#34;: 5 }, { \u0026#34;appName\u0026#34;: \u0026#34;sjbd\u0026#34;, \u0026#34;appLink\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;random\u0026#34;, \u0026#34;link\u0026#34;: \u0026#34;baiduboxapp://v1/easybrowse/open?url=https://dwz.cn/1VJnrokX?u=68a5251f61c446dd\u0026amp;needlog=1\u0026amp;logargs={\u0026#34;source\u0026#34;:\u0026#34;1023217w\u0026#34;,\u0026#34;from\u0026#34;:\u0026#34;openbox\u0026#34;,\u0026#34;page\u0026#34;:\u0026#34;other\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;\u0026#34;,\u0026#34;value\u0026#34;:\u0026#34;url\u0026#34;,\u0026#34;channel\u0026#34;:\u0026#34;\u0026#34;}\u0026#34; } ], \u0026#34;cancelTime\u0026#34;: 5 }, { \u0026#34;appName\u0026#34;: \u0026#34;yk\u0026#34;, \u0026#34;appLink\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;random\u0026#34;, \u0026#34;link\u0026#34;: \u0026#34;youku://weex?source=00002184\u0026amp;url=https://t.youku.com/yep/page/m/sanfang1903_wmdt?wh_weex=true\u0026amp;isNeedBaseImage=1\u0026amp;refer=sanfang1903_operation.qrwang_00002184_000000_2qiMB3_19053000\u0026amp;refer=sanfang1903_operation.qrwang_00002184_000000_2qiMB3_19053000\u0026#34; } ], \u0026#34;cancelTime\u0026#34;: 5 }, { \u0026#34;appName\u0026#34;: \u0026#34;wph\u0026#34;, \u0026#34;appLink\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;random\u0026#34;, \u0026#34;link\u0026#34;: \u0026#34;vipshop://goHome?tra_from=tra:C01V4m1bc22uzug2::mig_code::ac010m4olsydie4ern10dr6k8vkne6bd\u0026#34; } ], \u0026#34;cancelTime\u0026#34;: 5 }, { \u0026#34;appName\u0026#34;: \u0026#34;jdjr\u0026#34;, \u0026#34;appLink\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;random\u0026#34;, \u0026#34;link\u0026#34;: \u0026#34;jdmobile://share?jumpType=8\u0026amp;jumpUrl=https://u.jd.com/Yxw5iX?channellv=hqtf1\u0026amp;channel=default\u0026amp;sourceUrl=1108*gt001\u0026#34; } ], \u0026#34;cancelTime\u0026#34;: 5 }, { \u0026#34;appName\u0026#34;: \u0026#34;pdd\u0026#34;, \u0026#34;appLink\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;random\u0026#34;, \u0026#34;link\u0026#34;: \u0026#34;pinduoduo://com.xunmeng.pinduoduo/duo_coupon_landing.html?goods_id=2338511\u0026amp;pid=8827514_107105089\u0026amp;cpsSign=CC_190820_8827514_107105089_49f497cee8712faf331724b17240bda9\u0026amp;duoduo_type=2\u0026#34; } ], \u0026#34;cancelTime\u0026#34;: 5 }, { \u0026#34;appName\u0026#34;: \u0026#34;zfb\u0026#34;, \u0026#34;appLink\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;random\u0026#34;, \u0026#34;link\u0026#34;: \u0026#34;alipays://platformapi/startapp?appClearTop=false\u0026amp;appId=20000067\u0026amp;startMultApp=YES\u0026amp;url=https://render.alipay.com/p/f/fd-jr8wq5v4/pages/inside/index.html?pid=2088231933430185\u0026amp;partnerid=fl01\u0026amp;__webview_options__=pd%3DNO%26ttb%3Dauto\u0026amp;enableWK=YES\u0026#34; } ], \u0026#34;cancelTime\u0026#34;: 5 }, { \u0026#34;appName\u0026#34;: \u0026#34;jd\u0026#34;, \u0026#34;appLink\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;random\u0026#34;, \u0026#34;link\u0026#34;: \u0026#34;openapp.jdmobile://virtual?params={\\\u0026#34;category\\\u0026#34;:\\\u0026#34;jump\\\u0026#34;,\\\u0026#34;sourceType\\\u0026#34;:\\\u0026#34;sourceType_test\\\u0026#34;,\\\u0026#34;des\\\u0026#34;:\\\u0026#34;m\\\u0026#34;,\\\u0026#34;url\\\u0026#34;:\\\u0026#34;https://u.jd.com/dRrNLl\\\u0026#34;,\\\u0026#34;unionSource\\\u0026#34;:\\\u0026#34;Awake\\\u0026#34;,\\\u0026#34;channel\\\u0026#34;:\\\u0026#34;cedad4c0ad02455c9a818f1b3d98da1a\\\u0026#34;,\\\u0026#34;union_open\\\u0026#34;:\\\u0026#34;union_cps\\\u0026#34;}\u0026#34; } ], \u0026#34;cancelTime\u0026#34;: 5 }, { \u0026#34;appName\u0026#34;: \u0026#34;jrtt\u0026#34;, \u0026#34;appLink\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;date\u0026#34;, \u0026#34;2019-08-30\u0026#34;: \u0026#34;snssdk143://search?keyword=信息学奥赛取消+有学生集训数月\u0026amp;from=gs_ac_click_schema_lx26\u0026amp;growth_from=click_schema_lx26\u0026amp;pd=synthesis\u0026amp;source=click_schema_lx26\u0026amp;needlaunchlog=1\u0026amp;gd_label=click_schema_lx26\u0026#34;, \u0026#34;2019-08-31\u0026#34;: \u0026#34;snssdk143://search?keyword=在家乡一口气买十套房？柳岩回应\u0026amp;from=gs_ac_click_schema_lx26\u0026amp;growth_from=click_schema_lx26\u0026amp;pd=synthesis\u0026amp;source=click_schema_lx26\u0026amp;needlaunchlog=1\u0026amp;gd_label=click_schema_lx26\u0026#34;, \u0026#34;2019-09-01\u0026#34;: \u0026#34;snssdk143://search?keyword=国内首例克隆猫主人：花了25万\u0026amp;from=gs_ac_click_schema_lx26\u0026amp;growth_from=click_schema_lx26\u0026amp;pd=synthesis\u0026amp;source=click_schema_lx26\u0026amp;needlaunchlog=1\u0026amp;gd_label=click_schema_lx26\u0026#34;, \u0026#34;2019-09-02\u0026#34;: \u0026#34;snssdk143://search?keyword=迪士尼不接受调解+坚持翻包检查\u0026amp;from=gs_ac_click_schema_lx26\u0026amp;growth_from=click_schema_lx26\u0026amp;pd=synthesis\u0026amp;source=click_schema_lx26\u0026amp;needlaunchlog=1\u0026amp;gd_label=click_schema_lx26\u0026#34;, \u0026#34;2019-09-03\u0026#34;: \u0026#34;snssdk143://search?keyword=宠物医疗市场扩张+执业医师稀缺\u0026amp;from=gs_ac_click_schema_lx26\u0026amp;growth_from=click_schema_lx26\u0026amp;pd=synthesis\u0026amp;source=click_schema_lx26\u0026amp;needlaunchlog=1\u0026amp;gd_label=click_schema_lx26\u0026#34;, \u0026#34;2019-09-04\u0026#34;: \u0026#34;snssdk143://search?keyword=游客坐路中央拍照交警提醒\u0026amp;from=gs_ac_click_schema_lx26\u0026amp;growth_from=click_schema_lx26\u0026amp;pd=synthesis\u0026amp;source=click_schema_lx26\u0026amp;needlaunchlog=1\u0026amp;gd_label=click_schema_lx26\u0026#34;, \u0026#34;2019-09-05\u0026#34;: \u0026#34;snssdk143://search?keyword=天降垃圾砸车可起诉全楼\u0026amp;from=gs_ac_click_schema_lx26\u0026amp;growth_from=click_schema_lx26\u0026amp;pd=synthesis\u0026amp;source=click_schema_lx26\u0026amp;needlaunchlog=1\u0026amp;gd_label=click_schema_lx26\u0026#34;, \u0026#34;2019-09-06\u0026#34;: \u0026#34;snssdk143://search?keyword=健身房承诺开泳池未兑现被投诉\u0026amp;from=gs_ac_click_schema_lx26\u0026amp;growth_from=click_schema_lx26\u0026amp;pd=synthesis\u0026amp;source=click_schema_lx26\u0026amp;needlaunchlog=1\u0026amp;gd_label=click_schema_lx26\u0026#34; } ], \u0026#34;cancelTime\u0026#34;: 5 }, { \u0026#34;appName\u0026#34;: \u0026#34;douyin\u0026#34;, \u0026#34;appLink\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;date\u0026#34;, \u0026#34;2019-08-30\u0026#34;: \u0026#34;snssdk1128://detail?id=6727796549604150532\u0026amp;gd_label=click_schema_lx5\u0026#34;, \u0026#34;2019-08-31\u0026#34;: \u0026#34;snssdk1128://detail?id=6727793959982157063\u0026amp;gd_label=click_schema_lx5\u0026#34;, \u0026#34;2019-09-01\u0026#34;: \u0026#34;snssdk1128://detail?id=6728772476395949320\u0026amp;gd_label=click_schema_lx5\u0026#34;, \u0026#34;2019-09-02\u0026#34;: \u0026#34;snssdk1128://detail?id=6728647813158145291\u0026amp;gd_label=click_schema_lx5\u0026#34;, \u0026#34;2019-09-03\u0026#34;: \u0026#34;snssdk1128://detail?id=6729018672242871556\u0026amp;gd_label=click_schema_lx5\u0026#34;, \u0026#34;2019-09-04\u0026#34;: \u0026#34;snssdk1128://detail?id=6729044398245498124\u0026amp;gd_label=click_schema_lx5\u0026#34;, \u0026#34;2019-09-05\u0026#34;: \u0026#34;snssdk1128://detail?id=6728696625901980931\u0026amp;gd_label=click_schema_lx5\u0026#34; } ], \u0026#34;cancelTime\u0026#34;: 5 } ] }, \u0026#34;avokeTime\u0026#34;: 2 } 在 productJson.secondaryProduct 看出，总共会跳转以下几个app\nUC sjbk(不知道是啥） yk(优酷) wph(不知道是啥） jdjr(京东金融) pdd(拼多多) zfb(支付宝) jd(京东) jrtt(不知道是啥) douyin(抖音) 可以看出来是真的恶心，最恶心的是跳转到这些页面\n1 2 https://mip.yemnn.cn/llq_5/p7069z.html https://m.685862.vip/2019llq_5/p7069z.html?20190901001245\u0026amp;t=1786766884\u0026amp;f=1\u0026amp;i=1 导致不能后退、强制下载app，而且又得看历史记录才能到原来浏览的地方。这个部分没有重现出来，后面补上。\n然后继续往上走，发现这个域名第一次出现的地方是\n1 https://cdn2.jianshu.io/asimov/2.0a635c573bb72b959d07.js，简书的cdn 同时访问搜狐的接口进行ip地域解析，根据用户所在地区进行不同的广告或者跳转app。 剩下的不用分析也知道了，只有几种可能\n简书 官方自己搞得跳转代码 简书用的cdn服务商进行的劫持 运营商结合cdn服务商一起劫持 此时我这里 cdn2.jianshu.io 解析的ip为：163.177.20.232 而在ipip和17ce发现，解析到这个ip的地区是广州联通、加上我的地区，会发生劫持。 Yandex浏览器添加ad插件进行屏蔽 跳转到页面，待复现分析\u0026hellip;\u0026hellip;\n更新 由于我开启了ipv6,默认解析dns变成了运营商的ipv6，导致返回的ip和公共dns不一样，运营商+cdn运营商劫持？openwrt居然不能指定ipv6的dns，dncp给客户端的v6居然是运营商的而电脑手机会按照v6的dns进行解析，不按照设置的v4 dns解析。\n根据ipip显示信息来看，是一家 天际友盟 广告联盟，而我好奇的是，这家公司是怎么拿到简书的ssl证书的？ 手机浏览器还显示绿标 更新 在禁用ipv6后，我本地使用114和119解析还是被劫持的ip\n","permalink":"https://blog.curlc.com/archives/600/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e每次手机上搜资料时，只要进入了简书，那么必定会跳转到各种app(淘宝、京东、天猫、京东金融等等)，很烦的啊。\u003cbr\u003e\n2020-02-02 更新:\u003cbr\u003e\n在csdn、豆瓣上也发现这个问题。\u003c/p\u003e\n\u003cp\u003e我还以为是我本地宽带或者dns劫持，但是我本地dns用的是114和119，很少出现这种问题，而且简书也是https，浏览器也是绿标，\u003cbr\u003e\n所以就usb chrome 远程调试看了下，不看不知道，居然会唤醒这么多app和跳转网页。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/08/31/35792449738f2b472537e8669855632a.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"临时解决方案\"\u003e临时解决方案\u003c/h2\u003e\n\u003ch3 id=\"屏蔽-adlfluckycom-这个域名建议屏蔽这个域名下的所有二级域名host改也行\"\u003e屏蔽  ad.lflucky.com 这个域名(建议屏蔽这个域名下的所有二级域名)，host改也行。\u003c/h3\u003e\n\u003cp\u003e方法一: 手机端使用 火狐浏览器，安装 AdGuard 广告过滤插件，屏蔽 ad.lflucky.com  \u003c/p\u003e\n\u003cp\u003e方法二、有位读者推荐的软件也很不错，\u003ca href=\"https://blog.curlc.com/archives/679.html\"\u003eAdGuard Home\u003c/a\u003e ，安装在软路由中使用~\u003c/p\u003e\n\u003ch3 id=\"2020-03-09\"\u003e2020-03-09:\u003c/h3\u003e\n\u003cp\u003e广告代码改为\u003ccode\u003ehttps://jian.t58b.com/js/jan/jian.js\u003c/code\u003e所以，继续屏蔽 jian.t58b.com\u003c/p\u003e\n\u003cp\u003e \n最后想了下，既然是cdn劫持，那么我把cdn域名一刀切怎么样，别说，效果还蛮不错的，界面干净了。\n屏蔽整个cdn下的js，不过这样带来的后果是文章不能动态加载出来，只适合偶尔使用简书。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecdn2.jianshu.io/*.js\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e手机端用yandex浏览器，装广告屏蔽插件，屏蔽  ad.lflucky.com 这个域名(建议屏蔽这个域名下的所有二级域名)，我个人装的是广告终结者，本来想装uBlock的，懒得折腾就没装。或者路由器ad插件屏蔽这个域名。添加屏蔽域名后完美，终于不再跳转。\u003c/p\u003e\n\u003ch2 id=\"分析\"\u003e分析\u003c/h2\u003e\n\u003cp\u003e因为我的前端是废的，所以也只能进行简单点的分析，大佬们看看就好了。\n简单分析了一下跳转js，点击 VM2486:1 进入到js，格式化后的代码如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e  1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e112\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e113\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e114\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e115\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e116\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e117\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e118\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e119\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e120\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e121\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e122\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e123\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e124\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e125\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e126\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e127\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e128\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e129\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e130\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e131\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e132\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003egetJson\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ec\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eXMLHttpRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;get\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eonreadystatechange\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ereadyState\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e4\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estatus\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"nx\"\u003eb\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eeval\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;(\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eresponseText\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;)\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eProductLink\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproduct\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproductJson\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edisabledArea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;UNITED STATES\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;JAPAN\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;SINGAPORE\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;CANADA\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;香港\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;北京\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;上海\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eavokeTime\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eavokeTime\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"nx\"\u003eProductLink\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprototype\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003einit\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eb\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enavigator\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eplatform\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eindexOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Win\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"nb\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enavigator\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eplatform\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eindexOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Mac\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eisDisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"k\"\u003etry\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"nx\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edisabledArea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ereturnCitySN\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;cname\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003eindexOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edisabledArea\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\t\u003cspan class=\"nx\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\t\u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddElement\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"nx\"\u003eProductLink\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprototype\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eisDisabled\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eb\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;script\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ec\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eappendChild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://pv.sohu.com/cityjson\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eonload\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"nx\"\u003ec\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"nx\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003esetTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"nx\"\u003ec\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"nx\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"mi\"\u003e4000\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"nx\"\u003eProductLink\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprototype\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eaddElement\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003esetTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshowMainProject\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshowSecondaryProduct\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"mi\"\u003e2000\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"nx\"\u003eProductLink\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprototype\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshowMainProject\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshowAllKind\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproduct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emainProduct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eappLink\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproduct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emainProduct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecancelTime\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"nx\"\u003eProductLink\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprototype\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshowSecondaryProduct\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eb\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ec\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eproduct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esecondaryProduct\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econcat\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ee\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003ee\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003esetInterval\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"nx\"\u003eclearInterval\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eMath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efloor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eMath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erandom\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"nx\"\u003ed\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshowAllKind\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003eappLink\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003ecancelTime\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esplice\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"nx\"\u003ed\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eavokeTime\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"nx\"\u003eProductLink\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprototype\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eshowAllKind\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ec\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003econcat\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ee\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ef\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetCurrentDate\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ed\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003eg\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003eMath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efloor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eMath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003erandom\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"nx\"\u003ed\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eg\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;random\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enewIframe\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eg\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003elink\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"nx\"\u003ee\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eg\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eg\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"nx\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enewIframe\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eg\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"nx\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\u003cspan class=\"nx\"\u003ee\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esplice\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eg\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\u003cspan class=\"nx\"\u003ed\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"nx\"\u003eProductLink\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprototype\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetCurrentDate\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nb\"\u003eDate\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003eY\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetFullYear\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;-\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003eM\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetMonth\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e \u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetMonth\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetMonth\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;-\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003eD\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetDate\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e \u003cspan class=\"o\"\u003e?\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;0\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetDate\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egetDate\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nx\"\u003eY\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"nx\"\u003eM\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"nx\"\u003eD\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"nx\"\u003eProductLink\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprototype\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003enewIframe\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ed\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;iframe\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003ed\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edisplay\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;none\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003ed\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eappendChild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ed\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"kd\"\u003evar\u003c/span\u003e \u003cspan class=\"nx\"\u003ee\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;iframe\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003estyle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edisplay\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;none\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003esrc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;./counturl.html?url=\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"nb\"\u003eencodeURIComponent\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eappendChild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"nx\"\u003esetTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveChild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"nb\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eremoveChild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e})(\u003c/span\u003e\u003cspan class=\"nx\"\u003ed\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"nx\"\u003ec\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"nx\"\u003egetJson\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;./json/product.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eProductLink\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e})();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e嗯，上面有个getJson方法，搜索了下加载记录发现域名是：\u003c/p\u003e","title":"简书移动端Web劫持、跳转app问题"},{"content":"问题 上个月买的ex42机器，到今天才有时间测试，结果发现网速达不到G口，只有500m的样子，在群里大佬的帮助下，确定了是网卡驱动的问题，但是这款机器的网卡不一定全部一样，我的是\n1 I219-LM 系统自带模板中的网卡驱动有问题，DMA访问时间过长，NIC在繁重的UDP流量上挂起，这会影响TCP性能。\n修复方法： 为了重新获得完整的传输速度，可以通过以下命令关闭TCP分段卸载：\n1 ethtool -K \u0026lt;interface\u0026gt; tso off gso off 暂时关闭后可以达到标准速度，但是并不完全理想，实际上需要更新驱动程序，我就不折腾了。 官方wiki说明：https://wiki.hetzner.de/index.php/Low_performance_with_Intel_i218/i219_NIC/en\n开机启动自动加载NIC配置的方法：https://forum.manjaro.org/t/solved-only-half-gigabit-eth-with-intel-i219-lm-v-under-kernel-4-14-to-4-19/58886/37\n","permalink":"https://blog.curlc.com/archives/598/","summary":"\u003ch2 id=\"问题\"\u003e问题\u003c/h2\u003e\n\u003cp\u003e上个月买的ex42机器，到今天才有时间测试，结果发现网速达不到G口，只有500m的样子，在群里大佬的帮助下，确定了是网卡驱动的问题，但是这款机器的网卡不一定全部一样，我的是\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eI219-LM\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/08/30/ab4e8320ba90d6ec12806b25288e5c47.png\"\u003e\u003c/p\u003e\n\u003cp\u003e系统自带模板中的网卡驱动有问题，\u003cstrong\u003eDMA访问时间过长，NIC在繁重的UDP流量上挂起，这会影响TCP性能。\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"修复方法\"\u003e修复方法：\u003c/h2\u003e\n\u003cp\u003e为了重新获得完整的传输速度，可以通过以下命令关闭TCP分段卸载：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eethtool\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eK\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003einterface\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003etso\u003c/span\u003e \u003cspan class=\"n\"\u003eoff\u003c/span\u003e \u003cspan class=\"n\"\u003egso\u003c/span\u003e \u003cspan class=\"n\"\u003eoff\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e暂时关闭后可以达到标准速度，但是并不完全理想，实际上需要更新驱动程序，我就不折腾了。\n\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/09/02/34e46c264472f5201dbdcaac76f0202c.png\"\u003e\u003c/p\u003e\n\u003cp\u003e官方wiki说明：https://wiki.hetzner.de/index.php/Low_performance_with_Intel_i218/i219_NIC/en\u003c/p\u003e\n\u003cp\u003e开机启动自动加载NIC配置的方法：https://forum.manjaro.org/t/solved-only-half-gigabit-eth-with-intel-i219-lm-v-under-kernel-4-14-to-4-19/58886/37\u003c/p\u003e","title":"hetzner ex42 款机器网速只能达到一半解决方法"},{"content":"最近上手一台dell R720 的服务器，配置如下：\n1 2 3 4 5 6 cpu：E5 2650*2 内存：128G ddr3 1600 三星ssd *1 (具体型号忘记了) 2T 7200 sas硬盘 *2 双电源 H710阵列卡 iDRAC7 远程控制卡 然后我把原来的两块sas硬盘拆了装到这个机器上，组Raid5，平时没跑东西时功耗 98W（更新，功率计测试 106 W），CPU满载260W。\n然后通过ipmitool限制风扇转速(因为硬盘不是原厂的，导致识别不了风扇会提高转速)为20%，这样就不吵了，同时写脚本监控，如果cpu温度大于50°就开启风扇自动控制，以免温度过高，脚本参考链接。\nunixbench.sh 跑分(最后的多核没跑出来，因为我用的pve，debain用不了这个脚本，就开了lxc来跑)\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 make[1]: Leaving directory `/opt/unixbench/UnixBench\u0026#39; sh: 3dinfo: command not found # # # # # # # ##### ###### # # #### # # # # ## # # # # # # # ## # # # # # # # # # # # ## ##### ##### # # # # ###### # # # # # # ## # # # # # # # # # # # # ## # # # # # # # ## # # # # #### # # # # # ##### ###### # # #### # # Version 5.1.3 Based on the Byte Magazine Unix Benchmark Multi-CPU version Version 5 revisions by Ian Smith, Sunnyvale, CA, USA January 13, 2011 johantheghost at yahoo period com 1 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10 1 x Double-Precision Whetstone 1 2 3 4 5 6 7 8 9 10 1 x Execl Throughput 1 2 3 1 x File Copy 1024 bufsize 2000 maxblocks 1 2 3 1 x File Copy 256 bufsize 500 maxblocks 1 2 3 1 x File Copy 4096 bufsize 8000 maxblocks 1 2 3 1 x Pipe Throughput 1 2 3 4 5 6 7 8 9 10 1 x Pipe-based Context Switching 1 2 3 4 5 6 7 8 9 10 1 x Process Creation 1 2 3 1 x System Call Overhead 1 2 3 4 5 6 7 8 9 10 1 x Shell Scripts (1 concurrent) 1 2 3 1 x Shell Scripts (8 concurrent) 1 2 3 ======================================================================== BYTE UNIX Benchmarks (Version 5.1.3) System: CT100: GNU/Linux OS: GNU/Linux -- 4.15.18-10-pve -- #1 SMP PVE 4.15.18-32 (Sat, 19 Jan 2019 10:09:37 +0100) Machine: x86_64 (x86_64) Language: en_US.utf8 (charmap=\u0026#34;UTF-8\u0026#34;, collate=\u0026#34;UTF-8\u0026#34;) CPU 0: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 1: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 2: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 3: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 4: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 5: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 6: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 7: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 8: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 9: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 10: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 11: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 12: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 13: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 14: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 15: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 16: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 17: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 18: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 19: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 20: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 21: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 22: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 23: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 24: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 25: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 26: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 27: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 28: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 29: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 30: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4000.2 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization CPU 31: Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz (4002.3 bogomips) Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization 13:12:02 up 55 min, 1 user, load average: 1.13, 2.30, 1.47; runlevel 5 ------------------------------------------------------------------------ Benchmark Run: Tue Aug 20 2019 13:12:02 - 13:39:09 32 CPUs in system; running 1 parallel copy of tests Dhrystone 2 using register variables 30625056.6 lps (10.0 s, 7 samples) Double-Precision Whetstone 3710.8 MWIPS (5.6 s, 7 samples) Execl Throughput 3703.9 lps (30.0 s, 2 samples) File Copy 1024 bufsize 2000 maxblocks 531487.4 KBps (30.0 s, 2 samples) File Copy 256 bufsize 500 maxblocks 138496.2 KBps (30.0 s, 2 samples) File Copy 4096 bufsize 8000 maxblocks 1673546.3 KBps (30.0 s, 2 samples) Pipe Throughput 720341.4 lps (10.0 s, 7 samples) Pipe-based Context Switching 78789.3 lps (10.0 s, 7 samples) Process Creation 2392.4 lps (30.0 s, 2 samples) Shell Scripts (1 concurrent) 2302.9 lpm (60.0 s, 2 samples) Shell Scripts (8 concurrent) 1283.9 lpm (60.0 s, 2 samples) System Call Overhead 619739.3 lps (10.0 s, 7 samples) System Benchmarks Index Values BASELINE RESULT INDEX Dhrystone 2 using register variables 116700.0 30625056.6 2624.3 Double-Precision Whetstone 55.0 3710.8 674.7 Execl Throughput 43.0 3703.9 861.4 File Copy 1024 bufsize 2000 maxblocks 3960.0 531487.4 1342.1 File Copy 256 bufsize 500 maxblocks 1655.0 138496.2 836.8 File Copy 4096 bufsize 8000 maxblocks 5800.0 1673546.3 2885.4 Pipe Throughput 12440.0 720341.4 579.1 Pipe-based Context Switching 4000.0 78789.3 197.0 Process Creation 126.0 2392.4 189.9 Shell Scripts (1 concurrent) 42.4 2302.9 543.1 Shell Scripts (8 concurrent) 6.0 1283.9 2139.8 System Call Overhead 15000.0 619739.3 413.2 ======== System Benchmarks Index Score 780.9 ------------------------------------------------------------------------ Benchmark Run: Tue Aug 20 2019 13:39:09 - 13:39:09 32 CPUs in system; running 32 parallel copies of tests ======= Script description and score comparison completed! ======= ","permalink":"https://blog.curlc.com/archives/595/","summary":"\u003cp\u003e最近上手一台dell R720 的服务器，配置如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecpu：E5 2650*2  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e内存：128G ddr3 1600  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e三星ssd *1 (具体型号忘记了)  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2T 7200 sas硬盘 *2  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e双电源  H710阵列卡  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eiDRAC7 远程控制卡  \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e然后我把原来的两块sas硬盘拆了装到这个机器上，组Raid5，平时没跑东西时功耗 98W（更新，功率计测试 106 W），CPU满载260W。\u003cbr\u003e\n然后通过ipmitool限制风扇转速(因为硬盘不是原厂的，导致识别不了风扇会提高转速)为20%，这样就不吵了，同时写脚本监控，如果cpu温度大于50°就开启风扇自动控制，以免温度过高，脚本参考\u003ca href=\"https://ngx.hk/2018/10/02/%E9%9D%99%E9%9F%B3%EF%BC%81%E9%80%9A%E8%BF%87ipmi%E8%B0%83%E6%95%B4dell-t620%EF%BC%8812g%EF%BC%89%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%A3%E7%83%AD%E9%A3%8E%E6%89%87%E7%9A%84%E8%BD%AC%E9%80%9F.html\"\u003e链接\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/08/20/fc71702ad7e9f1cfa63d4d55ea735639.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/09/10/272df7c3330bda67f87211aa65923608.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/08/20/d2f583e385cc81c8b6f57ee5f7685b44.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/08/20/2257186d9e364a2d6173f01c28628c2f.png\"\u003e\u003c/p\u003e\n\u003cp\u003eunixbench.sh 跑分(最后的多核没跑出来，因为我用的pve，debain用不了这个脚本，就开了lxc来跑)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e  1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e  9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 69\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 70\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 71\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 72\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 73\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 74\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 75\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 76\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 77\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 78\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 79\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 80\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 81\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 82\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 83\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 84\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 85\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 86\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 87\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 88\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 89\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 90\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 91\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 92\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 93\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 94\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 95\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 96\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 97\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 98\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 99\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e100\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e101\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e102\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e103\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e104\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e105\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e106\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e107\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e108\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e109\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e110\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e111\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e112\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e113\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e114\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e115\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e116\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e117\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e118\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e119\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e120\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e121\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e122\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e123\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e124\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e125\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e126\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e127\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e128\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e129\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake\u003cspan class=\"o\"\u003e[\u003c/span\u003e1\u003cspan class=\"o\"\u003e]\u003c/span\u003e: Leaving directory \u003cspan class=\"sb\"\u003e`\u003c/span\u003e/opt/unixbench/UnixBench\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esh: 3dinfo: \u003cspan class=\"nb\"\u003ecommand\u003c/span\u003e not found\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# # # # # # # ##### ###### # # #### # #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# # ## # # # # # # # ## # # # # #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# # # # # # ## ##### ##### # # # # ######\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# # # # # # ## # # # # # # # # #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# # # ## # # # # # # # ## # # # #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#### # # # # # ##### ###### # # #### # #\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVersion 5.1.3 Based on the Byte Magazine Unix Benchmark\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMulti-CPU version Version \u003cspan class=\"m\"\u003e5\u003c/span\u003e revisions by Ian Smith,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSunnyvale, CA, USA\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJanuary 13, \u003cspan class=\"m\"\u003e2011\u003c/span\u003e johantheghost at yahoo period com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Dhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Double-Precision Whetstone \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Execl Throughput \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x File Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Pipe Throughput \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Pipe-based Context Switching \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Process Creation \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x System Call Overhead \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e \u003cspan class=\"m\"\u003e4\u003c/span\u003e \u003cspan class=\"m\"\u003e5\u003c/span\u003e \u003cspan class=\"m\"\u003e6\u003c/span\u003e \u003cspan class=\"m\"\u003e7\u003c/span\u003e \u003cspan class=\"m\"\u003e8\u003c/span\u003e \u003cspan class=\"m\"\u003e9\u003c/span\u003e \u003cspan class=\"m\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Shell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"m\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e x Shell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e \u003cspan class=\"m\"\u003e1\u003c/span\u003e \u003cspan class=\"m\"\u003e2\u003c/span\u003e \u003cspan class=\"nv\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e========================================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBYTE UNIX Benchmarks \u003cspan class=\"o\"\u003e(\u003c/span\u003eVersion 5.1.3\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem: CT100: GNU/Linux\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOS: GNU/Linux -- 4.15.18-10-pve -- \u003cspan class=\"c1\"\u003e#1 SMP PVE 4.15.18-32 (Sat, 19 Jan 2019 10:09:37 +0100)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMachine: x86_64 \u003cspan class=\"o\"\u003e(\u003c/span\u003ex86_64\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLanguage: en_US.utf8 \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"nv\"\u003echarmap\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;UTF-8\u0026#34;\u003c/span\u003e, \u003cspan class=\"nv\"\u003ecollate\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;UTF-8\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 0: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 1: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 2: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 3: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 4: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 5: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 6: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 7: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 8: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 9: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 10: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 11: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 12: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 13: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 14: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 15: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 16: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 17: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 18: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 19: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 20: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 21: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 22: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 23: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 24: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 25: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 26: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 27: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 28: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 29: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 30: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4000.2 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 31: Intel\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e Xeon\u003cspan class=\"o\"\u003e(\u003c/span\u003eR\u003cspan class=\"o\"\u003e)\u003c/span\u003e CPU E5-2650 \u003cspan class=\"m\"\u003e0\u003c/span\u003e @ 2.00GHz \u003cspan class=\"o\"\u003e(\u003c/span\u003e4002.3 bogomips\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e13:12:02 up \u003cspan class=\"m\"\u003e55\u003c/span\u003e min, \u003cspan class=\"m\"\u003e1\u003c/span\u003e user, load average: 1.13, 2.30, 1.47\u003cspan class=\"p\"\u003e;\u003c/span\u003e runlevel \u003cspan class=\"m\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e------------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBenchmark Run: Tue Aug \u003cspan class=\"m\"\u003e20\u003c/span\u003e \u003cspan class=\"m\"\u003e2019\u003c/span\u003e 13:12:02 - 13:39:09\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e32\u003c/span\u003e CPUs in system\u003cspan class=\"p\"\u003e;\u003c/span\u003e running \u003cspan class=\"m\"\u003e1\u003c/span\u003e parallel copy of tests\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables 30625056.6 lps \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDouble-Precision Whetstone 3710.8 MWIPS \u003cspan class=\"o\"\u003e(\u003c/span\u003e5.6 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExecl Throughput 3703.9 lps \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks 531487.4 KBps \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks 138496.2 KBps \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks 1673546.3 KBps \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe Throughput 720341.4 lps \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe-based Context Switching 78789.3 lps \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcess Creation 2392.4 lps \u003cspan class=\"o\"\u003e(\u003c/span\u003e30.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e 2302.9 lpm \u003cspan class=\"o\"\u003e(\u003c/span\u003e60.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e 1283.9 lpm \u003cspan class=\"o\"\u003e(\u003c/span\u003e60.0 s, \u003cspan class=\"m\"\u003e2\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Call Overhead 619739.3 lps \u003cspan class=\"o\"\u003e(\u003c/span\u003e10.0 s, \u003cspan class=\"m\"\u003e7\u003c/span\u003e samples\u003cspan class=\"o\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Benchmarks Index Values BASELINE RESULT INDEX\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDhrystone \u003cspan class=\"m\"\u003e2\u003c/span\u003e using register variables 116700.0 30625056.6 2624.3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDouble-Precision Whetstone 55.0 3710.8 674.7\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExecl Throughput 43.0 3703.9 861.4\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e1024\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e2000\u003c/span\u003e maxblocks 3960.0 531487.4 1342.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e256\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e500\u003c/span\u003e maxblocks 1655.0 138496.2 836.8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFile Copy \u003cspan class=\"m\"\u003e4096\u003c/span\u003e bufsize \u003cspan class=\"m\"\u003e8000\u003c/span\u003e maxblocks 5800.0 1673546.3 2885.4\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe Throughput 12440.0 720341.4 579.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePipe-based Context Switching 4000.0 78789.3 197.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProcess Creation 126.0 2392.4 189.9\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e 42.4 2302.9 543.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShell Scripts \u003cspan class=\"o\"\u003e(\u003c/span\u003e\u003cspan class=\"m\"\u003e8\u003c/span\u003e concurrent\u003cspan class=\"o\"\u003e)\u003c/span\u003e 6.0 1283.9 2139.8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Call Overhead 15000.0 619739.3 413.2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e========\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSystem Benchmarks Index Score 780.9\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e------------------------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBenchmark Run: Tue Aug \u003cspan class=\"m\"\u003e20\u003c/span\u003e \u003cspan class=\"m\"\u003e2019\u003c/span\u003e 13:39:09 - 13:39:09\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"m\"\u003e32\u003c/span\u003e CPUs in system\u003cspan class=\"p\"\u003e;\u003c/span\u003e running \u003cspan class=\"m\"\u003e32\u003c/span\u003e parallel copies of \u003cspan class=\"nv\"\u003etests\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e=======\u003c/span\u003e Script description and score comparison completed! \u003cspan class=\"o\"\u003e=======\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"上手一台Dell R720"},{"content":"关于我 简介 本站作者是一名持续学习与探索中的创作者，关注技术、思考与表达的结合。通过文字记录成长轨迹，也希望在分享过程中与更多人产生连接。\n关注方向 技术与工具：Java、Go、前端、DevOps、自动化 思考与认知：学习方法、效率提升、系统思维 记录与输出：写作、笔记整理、知识沉淀 写作初衷 建立博客的目的在于：\n将零散的知识系统化 通过输出倒逼理解与进步 为未来的回顾与复盘留下痕迹 内容可能不追求完美，但力求真实、清晰与可复用。\n关于风格 文章整体偏向：\n实用与可操作 结构化表达 尽量减少空话与情绪化描述 其中，由于本人不善言辞，文风可能较为直白甚至枯燥，特别是最近AI盛行，我会先将自己的想法写下来，再用AI辅助润色，导致内容看起来AI风格较大。希望读者能更多关注内容本身，而非表达方式。\n如有疏漏或不严谨之处，欢迎理性交流与指正。\n联系方式 Email：html6#msn.com(#换成@) 最后 感谢访问本站。若部分内容恰好带来启发或帮助，那将是我最大的欣慰。希望未来能持续改进与成长，也期待与更多志同道合的朋友交流。\n","permalink":"https://blog.curlc.com/about/","summary":"\u003ch1 id=\"关于我\"\u003e关于我\u003c/h1\u003e\n\u003ch2 id=\"简介\"\u003e简介\u003c/h2\u003e\n\u003cp\u003e本站作者是一名持续学习与探索中的创作者，关注技术、思考与表达的结合。通过文字记录成长轨迹，也希望在分享过程中与更多人产生连接。\u003c/p\u003e\n\u003ch2 id=\"关注方向\"\u003e关注方向\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e技术与工具：Java、Go、前端、DevOps、自动化\u003c/li\u003e\n\u003cli\u003e思考与认知：学习方法、效率提升、系统思维\u003c/li\u003e\n\u003cli\u003e记录与输出：写作、笔记整理、知识沉淀\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"写作初衷\"\u003e写作初衷\u003c/h2\u003e\n\u003cp\u003e建立博客的目的在于：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e将零散的知识系统化\u003c/li\u003e\n\u003cli\u003e通过输出倒逼理解与进步\u003c/li\u003e\n\u003cli\u003e为未来的回顾与复盘留下痕迹\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e内容可能不追求完美，但力求真实、清晰与可复用。\u003c/p\u003e\n\u003ch2 id=\"关于风格\"\u003e关于风格\u003c/h2\u003e\n\u003cp\u003e文章整体偏向：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e实用与可操作\u003c/li\u003e\n\u003cli\u003e结构化表达\u003c/li\u003e\n\u003cli\u003e尽量减少空话与情绪化描述\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003e其中，由于本人不善言辞，文风可能较为直白甚至枯燥，特别是最近AI盛行，我会先将自己的想法写下来，再用AI辅助润色，导致内容看起来\u003cstrong\u003eAI风格\u003c/strong\u003e较大。希望读者能更多关注内容本身，而非表达方式。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e如有疏漏或不严谨之处，欢迎理性交流与指正。\u003c/p\u003e\n\u003ch2 id=\"联系方式\"\u003e联系方式\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEmail：html6#msn.com(#换成@)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"最后\"\u003e最后\u003c/h2\u003e\n\u003cp\u003e感谢访问本站。若部分内容恰好带来启发或帮助，那将是我最大的欣慰。希望未来能持续改进与成长，也期待与更多志同道合的朋友交流。\u003c/p\u003e","title":"关于我"},{"content":"这个月hetzner机器都没有安装费，上手了一台EX42款的机器试一下，听说只有正价机器才有ddos防御？\n我运气不错，开到的cpu是7700，随便玩玩就做的raid0，反正数据每半个小时就会同步到google drive,还好是无限空间，随意传~\n电信的路由不错，联通就是绕美了 宝塔娱乐跑分，在docker下\n","permalink":"https://blog.curlc.com/archives/584/","summary":"\u003cp\u003e这个月hetzner机器都没有安装费，上手了一台EX42款的机器试一下，听说只有正价机器才有ddos防御？\u003c/p\u003e\n\u003cp\u003e我运气不错，开到的cpu是7700，随便玩玩就做的raid0，反正数据每半个小时就会同步到google drive,还好是无限空间，随意传~\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/07/16/5cbedd933b1403d9e83467ac2288eba0.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/07/16/1b1214b1aba4a25557f0a83884946cb5.png\"\u003e\u003c/p\u003e\n\u003cp\u003e电信的路由不错，联通就是绕美了\n宝塔娱乐跑分，在docker下\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/07/17/20eca06c2c8e7ee4340299a5c1043f46.png\"\u003e\u003c/p\u003e","title":"hetzner EX42款机器测试"},{"content":"1、新建虚拟机 这一步就不多说了，和平常新建的一样。硬盘给1G，反正到后面都要删掉。\n2、修改配置 分离硬盘并删除 添加网络设备 3、添加RouterOS CHR固件 1 2 3 4 5 6 7 8 9 10 11 12 #下载RouterOS CHR固件 想下别的版本请在 [mikrotik官网下载](https://mikrotik.com/download) wget https://download.mikrotik.com/routeros/6.43.16/chr-6.43.16.img.zip -O chr.img.zip #解压缩 gunzip -c chr.img.zip \u0026gt; chr.img #转换映像重命名 qemu-img convert -f raw -O qcow2 chr.img vm-100-disk-1.qcow2 #查看映像信息 qemu-img info vm-100-disk-1.qcow2 #增加映像大小 根据自己使用调整 qemu-img resize -f qcow2 vm-100-disk-1.qcow2 +1G #加载映像到虚拟机 qm importdisk 100 vm-100-disk-1.qcow2 local-lvm 请注意红色的文字(也就是 100)，你新建的虚拟机的id是多少，那么你要将红色部分改为新建虚拟机的ID。\n4、添加镜像到虚拟机并修改启动引导项 在pve界面添加硬盘\u0026hellip;\u0026hellip;.略\u0026hellip;.\n因为已经删除了新建时候的硬盘，所以这里需要将引导项改为新的硬盘\n5、试用RouterOS CHR P1授权 在mikrotik官网注册一个账号（需要特殊的上网方式，因为启用了Google人机验证），然后可以免费试用2个月 在System - License - Renew License 输入你注册的id(e-mail)和密码，就可以进行试用了，淘宝上也有卖P1授权的，大概在157 rmb左右吧。\n7.2更新 在添加网卡时，我选择的模型是 Intel E1000 ，CPU占用异常的高(不知道啥原因)，同时不能跑满宽带，改为 VirtIO (半虚拟化) 后就正常了，当然做网卡直通更好。\n参考文章:https://koolshare.cn/thread-159150-1-1.html\n","permalink":"https://blog.curlc.com/archives/566/","summary":"\u003ch3 id=\"1新建虚拟机\"\u003e1、新建虚拟机\u003c/h3\u003e\n\u003cp\u003e这一步就不多说了，和平常新建的一样。硬盘给1G，反正到后面都要删掉。\u003c/p\u003e\n\u003ch3 id=\"2修改配置\"\u003e2、修改配置\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e分离硬盘并删除\u003c/li\u003e\n\u003cli\u003e添加网络设备\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"3添加routeros-chr固件\"\u003e3、添加RouterOS CHR固件\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#下载RouterOS CHR固件 想下别的版本请在 [mikrotik官网下载](https://mikrotik.com/download)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget https://download.mikrotik.com/routeros/6.43.16/chr-6.43.16.img.zip -O chr.img.zip\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#解压缩\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egunzip -c chr.img.zip \u0026gt; chr.img\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#转换映像重命名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eqemu-img convert -f raw -O qcow2 chr.img vm-100-disk-1.qcow2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#查看映像信息\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eqemu-img info vm-100-disk-1.qcow2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#增加映像大小 根据自己使用调整\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eqemu-img resize -f qcow2 vm-100-disk-1.qcow2 +1G\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#加载映像到虚拟机\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eqm importdisk \u003cspan class=\"m\"\u003e100\u003c/span\u003e vm-100-disk-1.qcow2 local-lvm\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e请注意红色的文字(也就是 100)，你新建的虚拟机的id是多少，那么你要将红色部分改为新建虚拟机的ID。\u003c/strong\u003e\u003c/p\u003e","title":"PVE安装RouterOS CHR"},{"content":"我们公司在用inotify+rsync做实时同步，来解决分布式集群文件一致性的问题。但当web文件越来越多(百万级数量html,jpg等小 文件)，同步就越来越慢，根本做不到实时，按照网上的调优方法都尝试过，问题根本没有解决。经过我一翻细致研究，终于把慢的核心问题研究明白，先总结一句 inotifywait响应不会有延迟，rsync也很快。大家同样有慢的烦恼，那是因为网上的inotify+rsync的教程都是坑。下面我们来分 析。\ninotifywait 单独分析 1 /usr/local/bin/inotifywait -mrq --format \u0026#39;%Xe %w%f\u0026#39; -e modify,create,delete,attrib /data/ 执行上面命令，是让inotifywait监听/data/目录，当监听到有发生modify,create,delete,attrib等事件发生时，按%Xe %w%f的格式输出。 在/data/目录touch几个文件\n1 touch /data/{1..5} 观看inotify输出\n1 ATTRIB /data/1 -- 表示发生了ATTRIB事件 路径为/data/1 ATTRIB /data/2 ATTRIB /data/3 ATTRIB /data/4 ATTRIB /data/5 知道上面的输出效果之后 我们应该想得到，可以用rsync获取inotifywait监控到的文件列表来做指定的文件同步，而不是每次都由rsync做全目录扫描来判断文件是否存在差异。\n网上的inotify+rsync分析 我们来看网上的教程，我加了注释。(网上所有的教程基本都一模一样，尽管写法不一样，致命点都是一样的)\n1 2 3 4 5 6 #!/bin/bash /usr/bin/inotifywait -mrq --format \u0026#39;%w%f\u0026#39;-e create,close_write,delete /backup |while read file #把发生更改的文件列表都接收到file 然后循环，但有什么鬼用呢？下面的命令都没有引用这个$file 下面做的是全量rsync do cd /backup \u0026amp;\u0026amp; rsync -az --delete /backup/ rsync_backup@192.168.24.101::backup/--password-file=/etc/rsync.password done #注意看 这里的rsync 每次都是全量的同步(这就坑爹了)，而且 file列表是循环形式触发rsync ，等于有10个文件发生更改，就触发10次rsync全量同步(简直就是噩梦)，那还不如直接写个死循环的rsync全量同步得了。 #有很多人会说 日志输出那里明明只有差异文件的同步记录。其实这是rsync的功能，他本来就只会输出有差异需要同步的文件信息。不信你直接拿这句rsync来跑试试。 #这种在需要同步的源目录文件量很大的情况下，简直是不堪重负。不仅耗CPU还耗时，根本不可以做到实时同步。\n改良方法 要做到实时，就必须要减少rsync对目录的递归扫描判断，尽可能的做到只同步inotify监控到已发生更改的文件。结合rsync的特性，所以这里要分开判断来实现一个目录的增删改查对应的操作。 脚本如下\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #!/bin/bash src=/data/ # 需要同步的源路径 des=data # 目标服务器上 rsync --daemon 发布的名称，rsync --daemon这里就不做介绍了，网上搜一下，比较简单。 rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件 ip1=192.168.0.18 # 目标服务器1 ip2=192.168.0.19 # 目标服务器2 user=root # rsync --daemon定义的验证用户名 cd ${src} # 此方法中，由于rsync同步的特性，这里必须要先cd到源目录，inotify再监听 ./ 才能rsync同步后目录结构一致，有兴趣的同学可以进行各种尝试观看其效果 /usr/local/bin/inotifywait -mrq --format \u0026#39;%Xe %w%f\u0026#39; -e modify,create,delete,attrib,close_write,move ./ | while read file # 把监控到有发生更改的\u0026#34;文件路径列表\u0026#34;循环 do INO_EVENT=$(echo $file | awk \u0026#39;{print $1}\u0026#39;) # 把inotify输出切割 把事件类型部分赋值给INO_EVENT INO_FILE=$(echo $file | awk \u0026#39;{print $2}\u0026#39;) # 把inotify输出切割 把文件路径部分赋值给INO_FILE echo \u0026#34;-------------------------------$(date)------------------------------------\u0026#34; echo $file #增加、修改、写入完成、移动进事件 #增、改放在同一个判断，因为他们都肯定是针对文件的操作，即使是新建目录，要同步的也只是一个空目录，不会影响速度。 if [[ $INO_EVENT =~ \u0026#39;CREATE\u0026#39; ]] || [[ $INO_EVENT =~ \u0026#39;MODIFY\u0026#39; ]] || [[ $INO_EVENT =~ \u0026#39;CLOSE_WRITE\u0026#39; ]] || [[ $INO_EVENT =~ \u0026#39;MOVED_TO\u0026#39; ]] # 判断事件类型 then echo \u0026#39;CREATE or MODIFY or CLOSE_WRITE or MOVED_TO\u0026#39; rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} \u0026amp;\u0026amp; # INO_FILE变量代表路径哦 -c校验文件内容 rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端 #环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) #然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性 fi #删除、移动出事件 if [[ $INO_EVENT =~ \u0026#39;DELETE\u0026#39; ]] || [[ $INO_EVENT =~ \u0026#39;MOVED_FROM\u0026#39; ]] then echo \u0026#39;DELETE or MOVED_FROM\u0026#39; rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} \u0026amp;\u0026amp; rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径 #并加上--delete来删除目标上有而源中没有的文件，这里不能做到指定文件删除，如果删除的路径越靠近根，则同步的目录月多，同步删除的操作就越花时间。 #这里有更好方法的同学，欢迎交流。 fi #修改属性事件 指 touch chgrp chmod chown等操作 if [[ $INO_EVENT =~ \u0026#39;ATTRIB\u0026#39; ]] then echo \u0026#39;ATTRIB\u0026#39; if [ ! -d \u0026#34;$INO_FILE\u0026#34; ] # 如果修改属性的是目录 则不同步，因为同步目录会发生递归扫描，等此目录下的文件发生同步时，rsync会顺带更新此目录。 then rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} \u0026amp;\u0026amp; rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} fi fi done 每两小时做1次全量同步 因为inotify只在启动时会监控目录，他没有启动期间的文件发生更改，他是不知道的，所以这里每2个小时做1次全量同步，防止各种意外遗漏，保证目录一致。\n1 2 crontab -e * */2 * * * rsync -avz --password-file=/etc/rsync-client.pass /data/ root@192.168.0.18::data \u0026amp;\u0026amp; rsync -avz --password-file=/etc/rsync-client.pass /data/ root@192.168.0.19::data 改良后我们公司这种百万级小文件也能做到实施同步了。\n下面附上inotify的参数说明 inotify介绍\u0026ndash; 是一种强大的、细颗粒的、异步的文件系统监控机制，内核从2.6.13起，加入Inotify可以监控文件系统中添加、删除、修改移动等各种事件，利用这个内核接口，就可以监控文件系统下文件的各种变化情况。\ninotifywait 参数说明 参数名称 参数说明\n-m,–monitor 始终保持事件监听状态\n-r,–recursive 递归查询目录\n-q,–quiet 只打印监控事件的信息\n–excludei 排除文件或目录时，不区分大小写\n-t,–timeout 超时时间\n–timefmt 指定时间输出格式\n–format 指定时间输出格式\n-e,–event 后面指定删、增、改等事件\ninotifywait events事件说明 事件名称 事件说明\naccess 读取文件或目录内容\nmodify 修改文件或目录内容\nattrib 文件或目录的属性改变\nclose_write 修改真实文件内容\nclose_nowrite\nclose\nopen 文件或目录被打开\nmoved_to 文件或目录移动到\nmoved_from 文件或目录从移动\nmove 移动文件或目录移动到监视目录\ncreate 在监视目录下创建文件或目录\ndelete 删除监视目录下的文件或目录\ndelete_self\nunmount 卸载文件系统\n优化** Inotify** # 在/proc/sys/fs/inotify目录下有三个文件，对inotify机制有一定的限制 1 2 3 4 5 [root@web ~]# ll /proc/sys/fs/inotify/ 总用量0 -rw-r--r--1 root root 09月923:36 max_queued_events -rw-r--r--1 root root 09月923:36 max_user_instances -rw-r--r--1 root root 09月923:36 max_user_watches max_user_watches #设置inotifywait或inotifywatch命令可以监视的文件数量(单进程)\nmax_user_instances #设置每个用户可以运行的inotifywait或inotifywatch命令的进程数\nmax_queued_events #设置inotify实例事件(event)队列可容纳的事件数量\n1 2 [root@web ~]# echo 50000000\u0026gt;/proc/sys/fs/inotify/max_user_watches -- 把他加入/etc/rc.local就可以实现每次重启都生效 [root@web ~]# echo 50000000\u0026gt;/proc/sys/fs/inotify/max_queued_events 附录： Rsync的命令格式可以为以下六种： 1 2 3 4 5 6 1 rsync [OPTION]... SRC DEST 2 rsync [OPTION]... SRC [USER@]HOST:DEST 3 rsync [OPTION]... [USER@]HOST:SRC DEST 4 rsync [OPTION]... [USER@]HOST::SRC DEST 5 rsync [OPTION]... SRC [USER@]HOST::DEST 6 rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST] 对应于以上六种命令格式，rsync有六种不同的工作模式：\n1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。如：rsync -a /data /backup 2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号”:”分隔符时启动该模式。如：rsync -avz *.c foo:src 3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。如：rsync -avz foo:src/bar /data 4)从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。如：rsync -av root@172.16.78.192::www /databack 5)从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。如：rsync -av /databack root@172.16.78.192::www 6)列远程机的文件列表。这类似于rsync传输，不过只要在命令中省略掉本地机信息即可。如：rsync -v rsync://172.16.78.192/www rsync参数的具体解释如下： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 -v, --verbose 详细模式输出 -q, --quiet 精简输出模式 -c, --checksum 打开校验开关，强制对文件传输进行校验 -a, --archive 归档模式，表示以递归方式传输文件，并保持所有文件属性，等于-rlptgoD -r, --recursive 对子目录以递归模式处理 -R, --relative 使用相对路径信息 -b, --backup 创建备份，也就是对于目的已经存在有同样的文件名时，将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。 --backup-dir 将备份文件(如~filename)存放在在目录下。 -suffix=SUFFIX 定义备份文件前缀 -u, --update 仅仅进行更新，也就是跳过所有已经存在于DST，并且文件时间晚于要备份的文件。(不覆盖更新的文件) -l, --links 保留软链结 -L, --copy-links 想对待常规文件一样处理软链结 --copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结 --safe-links 忽略指向SRC路径目录树以外的链结 -H, --hard-links 保留硬链结 -p, --perms 保持文件权限 -o, --owner 保持文件属主信息 -g, --group 保持文件属组信息 -D, --devices 保持设备文件信息 -t, --times 保持文件时间信息 -S, --sparse 对稀疏文件进行特殊处理以节省DST的空间 -n, --dry-run现实哪些文件将被传输 -W, --whole-file 拷贝文件，不进行增量检测 -x, --one-file-system 不要跨越文件系统边界 -B, --block-size=SIZE 检验算法使用的块尺寸，默认是700字节 -e, --rsh=COMMAND 指定使用rsh、ssh方式进行数据同步 --rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息 -C, --cvs-exclude 使用和CVS一样的方法自动忽略文件，用来排除那些不希望传输的文件 --existing 仅仅更新那些已经存在于DST的文件，而不备份那些新创建的文件 --delete 删除那些DST中SRC没有的文件 --delete-excluded 同样删除接收端那些被该选项指定排除的文件 --delete-after 传输结束以后再删除 --ignore-errors 及时出现IO错误也进行删除 --max-delete=NUM 最多删除NUM个文件 --partial 保留那些因故没有完全传输的文件，以是加快随后的再次传输 --force 强制删除目录，即使不为空 --numeric-ids 不将数字的用户和组ID匹配为用户名和组名 --timeout=TIME IP超时时间，单位为秒 -I, --ignore-times 不跳过那些有同样的时间和长度的文件 --size-only 当决定是否要备份文件时，仅仅察看文件大小而不考虑文件时间 --modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口，默认为0 -T --temp-dir=DIR 在DIR中创建临时文件 --compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份 -P 等同于 --partial --progress 显示备份过程 -z, --compress 对备份的文件在传输时进行压缩处理 --exclude=PATTERN 指定排除不需要传输的文件模式 --include=PATTERN 指定不排除而需要传输的文件模式 --exclude-from=FILE 排除FILE中指定模式的文件 --include-from=FILE 不排除FILE指定模式匹配的文件 --version 打印版本信息 --address 绑定到特定的地址 --config=FILE 指定其他的配置文件，不使用默认的rsyncd.conf文件 --port=PORT 指定其他的rsync服务端口 --blocking-io 对远程shell使用阻塞IO -stats 给出某些文件的传输状态 --progress 在传输时现实传输过程 --log-format=formAT 指定日志文件格式 --password-file=FILE 从FILE中得到密码 --bwlimit=KBPS 限制I/O带宽，KBytes per second -h, --help 显示帮助信息 本文转载至:https://www.cnblogs.com/ginvip/p/6430986.html\n","permalink":"https://blog.curlc.com/archives/573/","summary":"\u003cp\u003e我们公司在用inotify+rsync做实时同步，来解决分布式集群文件一致性的问题。但当web文件越来越多(百万级数量html,jpg等小 文件)，同步就越来越慢，根本做不到实时，按照网上的调优方法都尝试过，问题根本没有解决。经过我一翻细致研究，终于把慢的核心问题研究明白，先总结一句 inotifywait响应不会有延迟，rsync也很快。大家同样有慢的烦恼，那是因为网上的inotify+rsync的教程都是坑。下面我们来分 析。\u003c/p\u003e\n\u003ch3 id=\"inotifywait-单独分析\"\u003einotifywait 单独分析\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/usr/local/bin/inotifywait -mrq --format \u003cspan class=\"s1\"\u003e\u0026#39;%Xe %w%f\u0026#39;\u003c/span\u003e -e modify,create,delete,attrib /data/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e执行上面命令，是让inotifywait监听/data/目录，当监听到有发生modify,create,delete,attrib等事件发生时，按%Xe %w%f的格式输出。\n在/data/目录touch几个文件\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etouch /data/\u003cspan class=\"o\"\u003e{\u003c/span\u003e1..5\u003cspan class=\"o\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e观看inotify输出\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eATTRIB /data/1 -- 表示发生了ATTRIB事件 路径为/data/1 ATTRIB /data/2 ATTRIB /data/3 ATTRIB /data/4 ATTRIB /data/5\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \n知道上面的输出效果之后 我们应该想得到，可以用rsync获取inotifywait监控到的文件列表来做指定的文件同步，而不是每次都由rsync做全目录扫描来判断文件是否存在差异。\u003c/p\u003e\n\u003ch3 id=\"网上的inotifyrsync分析\"\u003e网上的inotify+rsync分析\u003c/h3\u003e\n\u003cp\u003e我们来看网上的教程，我加了注释。(网上所有的教程基本都一模一样，尽管写法不一样，致命点都是一样的)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/usr/bin/inotifywait -mrq --format \u003cspan class=\"s1\"\u003e\u0026#39;%w%f\u0026#39;\u003c/span\u003e-e create,close_write,delete /backup \u003cspan class=\"p\"\u003e|\u003c/span\u003e\u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"nb\"\u003eread\u003c/span\u003e file\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#把发生更改的文件列表都接收到file 然后循环，但有什么鬼用呢？下面的命令都没有引用这个$file 下面做的是全量rsync\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nb\"\u003ecd\u003c/span\u003e /backup \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e rsync -az --delete /backup/ rsync_backup@192.168.24.101::backup/--password-file\u003cspan class=\"o\"\u003e=\u003c/span\u003e/etc/rsync.password\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \n#注意看 这里的rsync 每次都是全量的同步(这就坑爹了)，而且 file列表是循环形式触发rsync ，等于有10个文件发生更改，就触发10次rsync全量同步(简直就是噩梦)，那还不如直接写个死循环的rsync全量同步得了。\n#有很多人会说 日志输出那里明明只有差异文件的同步记录。其实这是rsync的功能，他本来就只会输出有差异需要同步的文件信息。不信你直接拿这句rsync来跑试试。\n#这种在需要同步的源目录文件量很大的情况下，简直是不堪重负。不仅耗CPU还耗时，根本不可以做到实时同步。\u003c/p\u003e","title":"[转]真正的inotify+rsync实时同步 彻底告别同步慢"},{"content":"起因 看到有大佬科普了教育版onedrive怎么查看数据中心，捋了好久终于是捋清楚了几个版本的差别。 刚好最近热度比较大的网盘我都有在用，干脆整理下做下对比。 可能还有什么没有考虑到，欢迎大佬指正。\n1.几个了解到的情况 1.Googledrive，不管是教育账户，个人账户，团队盘。 使用的线路都没有什么大的差别，使用自家的服务器集群。 2.onedrive, 教育版A1，企业版E3 ，个人版都是走全球CDN, 经测试E3和A1下载地址后缀是sharepoint.com。走的cdn线路一样的。 个人版貌似线路IP不同。 3.onedrive世纪互联版数据中心在北京，上海，国内基本直通。 4.onedrive教育版,企业版,等sharepoint.com下载地址的，随着api泛滥，线路稳定性大打折扣。 5.谷歌盘单文件最大限制为 5T ，one盘单文件最大限制为 4G， 感谢大佬补充\n2.Googledrive 各类型对比。 a. G Suite 价格：12刀月。 空间：标注1T 实际为无限。 隐私：保障。 国内：不可用。 国际稳定性：好。 b. Google drive社区大学邮箱版。 价格：约20-50 隐私：无保障。 （非正规付费）其余同上 c. Google drive校友邮箱版。 价格：约100-300。 隐私：无保障。 （非正规付费）其余同上 d. Google drive团队盘版。 价格：约0-200年 隐私：完全无保障。\n（非正规付费）其余同上\n3.onedrive 各类型对比。 a. onedrive 个人版 价格：60-100年（拼车） 空间：1T 隐私：保障。 国内线路稳定性：好。 国内：可用。 a. onedrive 世纪互联版 价格：最低32.00用户/月 感谢大佬补充\n空间：1T及 隐私：保障。 国内线路稳定性：非常好。 国内：可用。 b. onedrive 开发者e3 全局 价格：300-500 空间：5T*25个账号 感谢大佬指正\n隐私：保障。 国内线路稳定性：不好。 国内：可用。 （附带桌面应用） b. onedrive 教育版a1 价格：0-10 空间：5T 隐私：无保障。 国内线路稳定性：不好。 国内：可用。\n4.总结 空间情况\n：谷歌盘最好。（无限） 便携情况\n：onedrive个人版最好。（国内可用,线路稳定,app多兼容) 线路情况\n：onedrive世纪互联版最好。(国内线路，全天候跑满。) 价格情况\n：无法对比，越贵越好。 稳定情况\n：无法对比，没有付费，或通过正规渠道付费的，都一定翻车，时间问题，不要心存侥幸，（一定做好数据备份）。 本文转载至:https://www.hostloc.com/thread-545474-1-1.html\n","permalink":"https://blog.curlc.com/archives/553/","summary":"\u003ch2 id=\"起因\"\u003e\u003cstrong\u003e起因\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e看到有大佬科普了教育版onedrive怎么查看数据中心，捋了好久终于是捋清楚了几个版本的差别。\n刚好最近热度比较大的网盘我都有在用，干脆整理下做下对比。\n可能还有什么没有考虑到，欢迎大佬指正。\u003c/p\u003e\n\u003ch2 id=\"1几个了解到的情况\"\u003e\u003cstrong\u003e1.几个了解到的情况\u003c/strong\u003e\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e1.Googledrive，不管是教育账户，个人账户，团队盘。 使用的线路都没有什么大的差别，使用自家的服务器集群。\u003c/li\u003e\n\u003cli\u003e2.onedrive, 教育版A1，企业版E3 ，个人版都是走全球CDN, 经测试E3和A1下载地址后缀是sharepoint.com。走的cdn线路一样的。 个人版貌似线路IP不同。\u003c/li\u003e\n\u003cli\u003e3.onedrive世纪互联版数据中心在北京，上海，国内基本直通。\u003c/li\u003e\n\u003cli\u003e4.onedrive教育版,企业版,等sharepoint.com下载地址的，随着api泛滥，线路稳定性大打折扣。\u003c/li\u003e\n\u003cli\u003e5.谷歌盘单文件最大限制为 5T   ，one盘单文件最大限制为 4G，\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e感谢大佬补充\u003c/p\u003e\n\u003ch2 id=\"2googledrive-各类型对比\"\u003e\u003cstrong\u003e2.Googledrive 各类型对比。\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003ea. G Suite \u003c/p\u003e\n\u003cp\u003e价格：12刀月。\n空间：标注1T 实际为无限。\n隐私：保障。\n国内：不可用。\n国际稳定性：好。\nb. Google drive社区大学邮箱版。 \u003c/p\u003e\n\u003cp\u003e价格：约20-50\n隐私：无保障。\n（非正规付费）其余同上\nc. Google drive校友邮箱版。 \u003c/p\u003e\n\u003cp\u003e价格：约100-300。\n隐私：无保障。\n（非正规付费）其余同上\nd. Google drive团队盘版。 \u003c/p\u003e\n\u003cp\u003e价格：约0-200年\n隐私：完全无保障。\u003c/p\u003e\n\u003cp\u003e（非正规付费）其余同上\u003c/p\u003e\n\u003ch2 id=\"3onedrive-各类型对比\"\u003e\u003cstrong\u003e3.onedrive 各类型对比。\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003ea. onedrive 个人版 \u003c/p\u003e\n\u003cp\u003e价格：60-100年（拼车）\n空间：1T\n隐私：保障。\n国内线路稳定性：好。\n国内：可用。\na. onedrive 世纪互联版 \u003c/p\u003e\n\u003cp\u003e价格：最低32.00用户/月  感谢大佬补充\u003c/p\u003e\n\u003cp\u003e空间：1T及\n隐私：保障。\n国内线路稳定性：非常好。\n国内：可用。\nb. onedrive 开发者e3 全局 \u003c/p\u003e","title":"553.对比Onedrive A1、A1 E3 GD等最近网盘的区别"},{"content":"1、Centos安装 yum 方式安装\n1 2 yum -y install epel-release yum install iperf 2、Windows安装 64位 https://iperf.fr/download/windows/iperf-2.0.8b-win64.zip\n32位 https://iperf.fr/download/windows/iperf-2.0.8b-win32.zip\n3、测速 1 2 服务器命令行：iperf -s -u -i 1 -p 8080 -l 1380 客户端运行：iperf -u -c 10.12.23.47 -p 8080 -l 1380 -B 10.12.32.45 -t 10 -i 1 -b 200M 参数解释：\n测试对端是10.12.23.47\n测试对端的端口是8080\n数据包大小是1380个字节\n绑定本地网卡10.12.32.45\n测试持续10秒钟\n每隔1秒钟打印一次信息\n最大发送带宽200M\n参数说明 参数说明\n-s ：以server模式启动，iperf -s\n-c host ： 以client模式启动，host是server端ip，iperf -c 222.35.11.23\n通用参数：\n-f [kmKM] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告，默认以Mbits为单位,\n-i sec 以秒为单位显示报告间隔\n-l 缓冲区大小，默认是8KB,\n-m 显示tcp最大mtu值\n-o 将报告和错误信息输出到文件\n-p 指定服务器端使用的端口或客户端所连接的端口\n-u 使用udp协议\n-w 指定TCP窗口大小，默认是8KB\n-B 绑定一个主机地址或接口（当主机有多个地址或接口时使用该参数）\n-C 兼容旧版本（当server端和client端版本不一样时使用）\n-M 设定TCP数据包的最大mtu值\n-N 设定TCP不延时\n-V 传输ipv6数据包\nserver专用参数：\n-D 以服务方式运行。\n-R 停止iperf服务。针对-D\nclient端专用参数：\n-d 同时进行双向传输测试\n-n 指定传输的字节数，\n-r 单独进行双向传输测试\n-t 测试时间，默认20秒,\n-F 指定需要传输的文件\n-T 指定ttl值\n参考文章:\nhttps://blog.csdn.net/qq_39009661/article/details/84247753\nhttps://blog.csdn.net/hacode/article/details/8517233\n","permalink":"https://blog.curlc.com/archives/548/","summary":"\u003ch2 id=\"1centos安装\"\u003e1、Centos安装\u003c/h2\u003e\n\u003cp\u003eyum 方式安装\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyum -y install epel-release\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyum install iperf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"2windows安装\"\u003e2、Windows安装\u003c/h2\u003e\n\u003cp\u003e64位 \u003ca href=\"https://iperf.fr/download/windows/iperf-2.0.8b-win64.zip\"\u003ehttps://iperf.fr/download/windows/iperf-2.0.8b-win64.zip\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e32位 \u003ca href=\"https://iperf.fr/download/windows/iperf-2.0.8b-win32.zip\"\u003ehttps://iperf.fr/download/windows/iperf-2.0.8b-win32.zip\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"3测速\"\u003e3、测速\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e服务器命令行：iperf -s -u -i 1 -p 8080 -l 1380\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e客户端运行：iperf -u -c 10.12.23.47 -p 8080 -l 1380  -B 10.12.32.45 -t 10 -i 1 -b 200M\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e参数解释：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e测试对端是10.12.23.47\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e测试对端的端口是8080\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e数据包大小是1380个字节\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e绑定本地网卡10.12.32.45\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e测试持续10秒钟\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e每隔1秒钟打印一次信息\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e最大发送带宽200M\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cimg alt=\"iperf测试udp带宽\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/04/18/7c32192bdeeaaf83210575508f51fd3f.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"参数说明\"\u003e参数说明\u003c/h2\u003e\n\u003cp\u003e参数说明\u003c/p\u003e\n\u003cp\u003e-s ：以server模式启动，iperf -s\u003c/p\u003e\n\u003cp\u003e-c host ： 以client模式启动，host是server端ip，iperf -c 222.35.11.23\u003c/p\u003e\n\u003cp\u003e通用参数：\u003c/p\u003e\n\u003cp\u003e-f [kmKM] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告，默认以Mbits为单位,\u003c/p\u003e","title":"iperf测试udp带宽"},{"content":"\n一直被这个问题折腾了好久，试过下面几种方法也不行\n1、更换阿里、uk、镜像 2、修改maven Importing的jvm参数, 默认为700多, 直接修改成 -Xms1024m -Xmx2048m 3、更换Maven版本和升级为最新的ida 4、清除Maven缓存 5、设置IDEA代理 最后在Maven的配置文件中设置http代理完美解决\n(个人觉得是有些包国内镜像也慢，不得不用到国外的源，而访问国外的源更慢，所以这里用 科学上网 的方式，设置代理让把流量转发到国外机器上面去)\n1 2 3 4 5 6 7 \u0026lt;proxy\u0026gt; \u0026lt;id\u0026gt;my-proxy\u0026lt;/id\u0026gt; \u0026lt;active\u0026gt;true\u0026lt;/active\u0026gt; \u0026lt;protocol\u0026gt;http\u0026lt;/protocol\u0026gt; \u0026lt;host\u0026gt;127.0.0.1\u0026lt;/host\u0026gt; \u0026lt;port\u0026gt;10801\u0026lt;/port\u0026gt; \u0026lt;/proxy\u0026gt; 同理，如果在clone github上的项目也出现卡顿的情况，也是用相同的方法，设置git代理\n1 2 3 4 5 6 7 8 9 # 设置ss代理 git config --global http.proxy \u0026#39;socks5://127.0.0.1:1080\u0026#39; git config --global https.proxy \u0026#39;socks5://127.0.0.1:1080\u0026#39; # 设置代理 git config --global https.proxy http://127.0.0.1:1080 git config --global https.proxy https://127.0.0.1:1080 # 取消代理 git config --global --unset http.proxy git config --global --unset https.proxy idea出现下载插件慢等问题，也可以设置代理\n","permalink":"https://blog.curlc.com/archives/546/","summary":"\u003cp\u003e\u003cimg alt=\"maven\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/04/16/1091d49e9070ff87f6d3d97e5c6aaadb.png\"\u003e\u003c/p\u003e\n\u003cp\u003e一直被这个问题折腾了好久，试过下面几种方法也不行\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e1、更换阿里、uk、镜像\u003c/li\u003e\n\u003cli\u003e2、修改maven Importing的jvm参数, 默认为700多, 直接修改成 -Xms1024m -Xmx2048m\u003c/li\u003e\n\u003cli\u003e3、更换Maven版本和升级为最新的ida\u003c/li\u003e\n\u003cli\u003e4、清除Maven缓存\u003c/li\u003e\n\u003cli\u003e5、设置IDEA代理\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e最后在\u003cstrong\u003eMaven的配置文件\u003c/strong\u003e中设置http代理完美解决\u003c/p\u003e\n\u003cp\u003e(个人觉得是有些包国内镜像也慢，不得不用到国外的源，而访问国外的源更慢，所以这里用 科学上网 的方式，设置代理让把流量转发到国外机器上面去)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026lt;proxy\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026lt;id\u0026gt;my-proxy\u0026lt;/id\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026lt;active\u0026gt;true\u0026lt;/active\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026lt;protocol\u0026gt;http\u0026lt;/protocol\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026lt;host\u0026gt;127.0.0.1\u0026lt;/host\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u0026lt;port\u0026gt;10801\u0026lt;/port\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026lt;/proxy\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/04/16/816a1262eca557a097925061b1738623.png\"\u003e\u003c/p\u003e\n\u003cp\u003e \n同理，如果在clone github上的项目也出现卡顿的情况，也是用相同的方法，设置\u003cstrong\u003egit代理\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 设置ss代理\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config --global http.proxy \u0026#39;socks5://127.0.0.1:1080\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config --global https.proxy \u0026#39;socks5://127.0.0.1:1080\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 设置代理\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config --global https.proxy http://127.0.0.1:1080\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config --global https.proxy https://127.0.0.1:1080\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 取消代理\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config --global --unset http.proxy\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit config --global --unset https.proxy\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e \nidea出现下载插件慢等问题，也可以设置代理\u003c/p\u003e","title":"Idea卡在Resolving Maven dependencies的解决方法"},{"content":" 前言:自定义了ipv6的DNS为240C::6666 在openwrt开启了ipv6后，有时候访问百度也觉得很慢，通过nslookup命令一看，居然解析到海外的百度ip去了，\n而且解析的dns服务器居然是v6的dns，不位置为啥会给我返回百度海外的ip(估计时电信绕美，再加上国内ipv6并不完善引起的)，最后用了一个最笨的方法，不传递ipv6的dns，全部由v4的dns进行解析。因为119.29.29.29之类的公共dns也是能返回v6的地址。\n","permalink":"https://blog.curlc.com/archives/544/","summary":"\u003cblockquote\u003e\n\u003cp\u003e前言:自定义了ipv6的DNS为240C::6666\n在openwrt开启了ipv6后，有时候访问百度也觉得很慢，通过nslookup命令一看，居然解析到海外的百度ip去了，\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/04/05/f3c151c021dd330c1a1ff6a689053a8e.png\"\u003e\u003c/p\u003e\n\u003cp\u003e而且解析的dns服务器居然是v6的dns，不位置为啥会给我返回百度海外的ip(估计时电信绕美，再加上国内ipv6并不完善引起的)，最后用了一个最笨的方法，不传递ipv6的dns，全部由v4的dns进行解析。因为119.29.29.29之类的公共dns也是能返回v6的地址。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/04/05/dc83e84aaf1184c93c3724ae2ef6c498.png\"\u003e\u003c/p\u003e","title":"544.openwrt开启ipv6引起访问网络慢的问题"},{"content":"淘宝很多卖onderive都是撸的以下E3\nA1和A1P A1和A1P都是教育版，不过呢A1P可以激活桌面版office。\nE3 MSDN E3 MSDN是MSDN订阅里提取链接注册的，25用户，理论永久。\nE3 Trial E3 Trial任何人都可以在官网申请，有效期一年；\nE3/E5 Symphony E3/E5 Symphony：这个都说不靠谱。\n以上订阅都有翻车可能，不要存重要资料。\n同时管理员能看见你们Ondrive网盘里面资料。\noffice 365 家庭版 目前官方卖的，可以和别人拼车一起买，咸鱼和淘宝大概50RMB一年，各自相互无法查看完工里面的资料(包括管理员)\n","permalink":"https://blog.curlc.com/archives/535/","summary":"\u003cp\u003e淘宝很多卖onderive都是撸的以下E3\u003c/p\u003e\n\u003ch2 id=\"a1和a1p\"\u003eA1和A1P\u003c/h2\u003e\n\u003cp\u003eA1和A1P都是教育版，不过呢A1P可以激活桌面版office。\u003c/p\u003e\n\u003ch2 id=\"e3-msdn\"\u003eE3 MSDN\u003c/h2\u003e\n\u003cp\u003eE3 MSDN是MSDN订阅里提取链接注册的，25用户，理论永久。\u003c/p\u003e\n\u003ch2 id=\"e3-trial\"\u003eE3 Trial\u003c/h2\u003e\n\u003cp\u003eE3 Trial任何人都可以在官网申请，有效期一年；\u003c/p\u003e\n\u003ch2 id=\"e3e5-symphony\"\u003eE3/E5 Symphony\u003c/h2\u003e\n\u003cp\u003eE3/E5 Symphony：这个都说不靠谱。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e以上订阅都有翻车可能，不要存重要资料。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e同时管理员能看见你们Ondrive网盘里面资料。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"office-365-家庭版\"\u003eoffice 365 家庭版\u003c/h2\u003e\n\u003cp\u003e目前官方卖的，可以和别人拼车一起买，咸鱼和淘宝大概50RMB一年，各自相互无法查看完工里面的资料(包括管理员)\u003c/p\u003e","title":"535.E3 Ondrive各种版本说明"},{"content":"用Proxmox官方提供的lxc centos7模板安装完宝塔后，nginx等等总无法安装上，看见lxc是兼容openvz的模板，就下载openvz的模板进行安装，安装完成后用设置的密码无法登录，google了下，看见一个命令能直接进入lxc容器中\n1 pct enter ID 这样就可以直接修改密码了~\nopenvz官方模板下载地址： https://download.openvz.org/template/precreated/\n","permalink":"https://blog.curlc.com/archives/528/","summary":"\u003cp\u003e用Proxmox官方提供的lxc centos7模板安装完宝塔后，nginx等等总无法安装上，看见lxc是兼容openvz的模板，就下载openvz的模板进行安装，安装完成后用设置的密码无法登录，google了下，看见一个命令能直接进入lxc容器中\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epct enter ID\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e这样就可以直接修改密码了~\u003c/p\u003e\n\u003cp\u003eopenvz官方模板下载地址： \u003ca href=\"https://download.openvz.org/template/precreated/\"\u003ehttps://download.openvz.org/template/precreated/\u003c/a\u003e\u003c/p\u003e","title":"Proxmox 修改lxc vps的密码"},{"content":"最近配了一台小服务器，准备做NAS和软路由，然后跑一些小项目啥的\n刚好遇到一个问题，装好proxmox后，插上阵列卡无法启动系统了，在阵列卡自检后就卡在左上角光标闪动，包括连BIOS都无法进入，只能进阵列卡控制界面。\n因为我系统是单独用的一块固态，没装在sas硬盘上，估计是引导出问题了。\n之后在阵列卡设置界面看到有一项 \u0026ldquo;Enable Controller BIOS\u0026rdquo;（启用控制器 BIOS）\n大概意思是\n选择此选项可以启用控制器 BIOS。如果引导设备在 RAID 控制器上，则必须启用 BIOS。禁用 BIOS 以使用其它引导设备。\n在多控制器环境中，可以在多个控制器上启用 BIOS。但是，如果要从特定的控制器进行引导，则需要在此控制器上启用 BIOS 并在其它控制器上禁用 BIOS。然后可以从启用了 BIOS 的控制器引导系统。\n尝试关闭，居然就可以了~\n参考文章：http://www.360doc.com/content/09/0824/09/226343_5200577.shtml\n","permalink":"https://blog.curlc.com/archives/527/","summary":"\u003cp\u003e最近配了一台小服务器，准备做NAS和软路由，然后跑一些小项目啥的\u003c/p\u003e\n\u003cp\u003e刚好遇到一个问题，装好proxmox后，插上阵列卡无法启动系统了，在阵列卡自检后就卡在左上角光标闪动，包括连BIOS都无法进入，只能进阵列卡控制界面。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e因为我系统是单独用的一块固态，没装在sas硬盘上，估计是引导出问题了。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e之后在阵列卡设置界面看到有一项 \u0026ldquo;\u003cstrong\u003eEnable Controller BIOS\u003c/strong\u003e\u0026rdquo;\u003cstrong\u003e（启用控制器 BIOS）\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e大概意思是\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e选择此选项可以启用控制器 BIOS。如果引导设备在 RAID 控制器上，则必须启用 BIOS。禁用 BIOS 以使用其它引导设备。\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e在多控制器环境中，可以在多个控制器上启用 BIOS。但是，如果要从特定的控制器进行引导，则需要在此控制器上启用 BIOS 并在其它控制器上禁用 BIOS。然后可以从启用了 BIOS 的控制器引导系统。\u003c/strong\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e尝试关闭，居然就可以了~\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"记录一下使用阵列卡，开机卡在左上角光标问题\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/03/06/91d4fc642f0f57a85b06f461a81bc69f.png\"\u003e\u003c/p\u003e\n\u003cp\u003e参考文章：http://www.360doc.com/content/09/0824/09/226343_5200577.shtml\u003c/p\u003e","title":"记录一下使用阵列卡，开机卡在左上角光标问题"},{"content":"在利用ipmi安装proxmox时遇到一个问题，proxmox显示界面只有一半，\n看不到右下角的同意按钮，弄了很久都没解决，包括换显示器什么的,最后群里有个大佬给我说，这是ipmi + uefi 的毛病，ipmi + uefi 分辨率只有 800x600， 最后按住 Alt+拖鼠标，把同意按钮显示出来~\n","permalink":"https://blog.curlc.com/archives/525/","summary":"\u003cp\u003e在利用ipmi安装proxmox时遇到一个问题，proxmox显示界面只有一半，\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"proxmox\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/03/03/319a45aba08c687a629210869a6845a8.png\"\u003e\u003c/p\u003e\n\u003cp\u003e看不到右下角的同意按钮，弄了很久都没解决，包括换显示器什么的,最后群里有个大佬给我说，这是ipmi + uefi 的毛病，ipmi + uefi 分辨率只有 800x600，\n最后按住 \u003cstrong\u003eAlt+拖鼠标\u003c/strong\u003e，把同意按钮显示出来~\u003c/p\u003e","title":"ipmi显示不全问题"},{"content":"最近也开始折腾proxmox了，因为这个免费~\n在OVH后台的模板中也有proxmox模板，不过呢，折腾下还是不错的~\n准备：\n下载proxmox安装镜像\nhttps://www.proxmox.com/en/downloads/category/iso-images-pve\n1、连接IPMI 连接文件在OVH后台下载就好了。\n注意：在国内不一定能连接上IPMI，原因你懂得\n这里需要用国外机器来进行连接IPMI，同时考虑到速度问题，也要用来挂载 proxmox\nISO文件\n我用的是KS-3B，挂载ISO速度很快~\n2、挂载ISO镜像 按照顺序进行挂载\n挂载成功\n3、修改Bios启动项 这里和平常设置启动项没什么区别。\n按 Ctrl + Alt+Del 重启 在开机界面按 del 进入抓板Bios 在 Boot 选项选择 CD/DVD:IPMI Virtual CDROM 300 选项 F4 保存(自动重启) 4、安装 proxmox 等待服务器自检完成后，会自动进入到安装界面\n设置时区\n设置密码\n设置密码\n设置IP信息，OVH网关一般是x.x.x254，点击Install就开始安装proxmox了\n安装完成，卸载ISO镜像文件\n此时点击 Reboot 重启，root密码就是刚刚设置的。\n5、开VPS(开小鸡) 安装完成后浏览器进入 https://ip:8006，进入Web管理\n账号root，密码则是刚才你自己设置的\n进入系统后，系统右上角\n创建虚拟主机：KVM架构vps\n创建CT：Lxc架构vps\n我个人比较喜欢用lxc，节约资源\n新装是没有模板的，需要自己下载\nKVM虚拟机所需的ISO镜像\b对应目录：\n1 /var/lib/vz/template/iso OpenVZ虚拟机所需的tar.gz镜像对应目录：\n1 /var/lib/vz/template/cache/ 模板下载地址：\nOVZ：https://download.openvz.org/template/precreated/\nKVM：就是原版iso\n剩下的就不说了，都能理解，但是网络这块还是要注意下\n如果是额外购买的IP，需要在OVH后台生成虚拟MAC，然后填入相应文本框中，OVH一般默认网关是 x.x.x.254\n其他的操作自己可以研究下。\n参考文章：\nhttps://jingyan.baidu.com/article/870c6fc36b5ad3b03fe4bed8.html\nhttps://post.smzdm.com/p/768830/\n","permalink":"https://blog.curlc.com/archives/518/","summary":"\u003cp\u003e最近也开始折腾proxmox了，因为这个免费~\u003c/p\u003e\n\u003cp\u003e在OVH后台的模板中也有proxmox模板，不过呢，折腾下还是不错的~\u003c/p\u003e\n\u003cp\u003e准备：\u003c/p\u003e\n\u003cp\u003e下载proxmox安装镜像\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.proxmox.com/en/downloads/category/iso-images-pve\"\u003ehttps://www.proxmox.com/en/downloads/category/iso-images-pve\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"OVH通过IPMI安装Proxmox开VPS\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/19/c4e67e5b7df703eadd1cc2e6f7bf37a5.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"1连接ipmi\"\u003e1、连接IPMI\u003c/h2\u003e\n\u003cp\u003e连接文件在OVH后台下载就好了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e注意：在国内不一定能连接上IPMI，原因你懂得\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e这里需要用国外机器来进行连接IPMI，同时考虑到速度问题，也要用来挂载 proxmox\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003eISO文件\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e我用的是KS-3B，挂载ISO速度很快~\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cimg alt=\"OVH通过IPMI安装proxmox \" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/19/f743c49a2acb6b61d90a72779c7af596.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"2挂载iso镜像\"\u003e2、挂载ISO镜像\u003c/h2\u003e\n\u003cp\u003e按照顺序进行挂载\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"OVH通过IPMI安装proxmox \" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/19/6957b9316ae2cebef450c2586730d1cf.png\"\u003e\u003c/p\u003e\n\u003cp\u003e挂载成功\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"OVH通过IPMI安装proxmox \" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/19/c4e9335d05acf93643b2b0f17333a2d5.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"3修改bios启动项\"\u003e3、修改Bios启动项\u003c/h2\u003e\n\u003cp\u003e这里和平常设置启动项没什么区别。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e按 Ctrl + Alt+Del 重启\u003c/li\u003e\n\u003cli\u003e在开机界面按 del 进入抓板Bios\u003c/li\u003e\n\u003cli\u003e在 Boot 选项选择 CD/DVD:IPMI Virtual CDROM 300 选项\u003c/li\u003e\n\u003cli\u003eF4 保存(自动重启)\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"4安装-proxmox\"\u003e4、安装 proxmox\u003c/h2\u003e\n\u003cp\u003e等待服务器自检完成后，会自动进入到安装界面\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"OVH通过IPMI安装proxmox \" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/19/0445829082c94be5b81ce33f2ad19624.png\"\u003e\u003c/p\u003e\n\u003cp\u003e设置时区\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"OVH通过IPMI安装proxmox \" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/19/6bb6d3de663648635e44c2fc3c44930b.png\"\u003e\u003c/p\u003e\n\u003cp\u003e设置密码\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"OVH通过IPMI安装proxmox \" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/19/67edd2371cd7e4efe0b54ab96c3131dd.png\"\u003e\u003c/p\u003e\n\u003cp\u003e设置密码\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"OVH通过IPMI安装proxmox \" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/19/fdc42553fde278c72e7cd65699a707ab.png\"\u003e\u003c/p\u003e\n\u003cp\u003e设置IP信息，OVH网关一般是x.x.x254，点击Install就开始安装proxmox了\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"OVH通过IPMI安装proxmox \" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/19/a0d3c48bbada123e3deb26abcaff98ed.png\"\u003e\u003c/p\u003e\n\u003cp\u003e安装完成，卸载ISO镜像文件\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"OVH通过IPMI安装proxmox \" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/19/b6b3551fa8c960d83aacf939649793c5.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"OVH通过IPMI安装proxmox \" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/19/790bd58f89d973e52b7e44d586df16c5.png\"\u003e\u003c/p\u003e\n\u003cp\u003e此时点击 Reboot 重启，root密码就是刚刚设置的。\u003c/p\u003e\n\u003ch2 id=\"5开vps开小鸡\"\u003e5、开VPS(开小鸡)\u003c/h2\u003e\n\u003cp\u003e安装完成后浏览器进入 https://ip:8006，进入Web管理\u003c/p\u003e","title":"OVH通过IPMI安装Proxmox开VPS"},{"content":" 在今年的任务计划中有一项是做一个视频网站，当然其中需要的就是将mp4转 m3u8 格式，为啥要转为m3u8呢？这是因为m3u8以片段的形式储存，快进的时候拉到哪就看哪，如果是完整的mp4文件，则需要全部下载，浪费服务器带宽和用户时间。\n1、下载ffmpeg https://ffmpeg.zeranoe.com/builds/\n下载完成后解压到任务目录(尽量不要有中文) 然后设置bin目录到系统环境变量(path)\n2、对视频进行转码(转为MP4) 为啥要转码呢？ 将视频文件转为视频编码h.264，音频编码aac格式的mp4文件\n1 ffmpeg -i out.mp4 -c:v libx264 -strict -2 real.mp4 out.mp4 是待转码的文件(可以是其他格式，比如avi\u0026hellip;\u0026hellip;之类的) real.mp4 是转码输出文件 libx264 转为 h.264编码\n这里我为啥要讲mp4再转码一次呢？因为我这个mp4视频文件不是h.264编码，所以需要再转一次，不然到后面切片的时候会遇到很多莫名其妙的问题。\n这个过程一般比较长，根据电脑CPU和视频长度决定。当然也可以使用GPU进行转码，这样更快~\n3、将MP4转换为ts格式文件(单个ts) 命令格式如下:\n1 2 ffmpeg -y -i 待转换mp4文件路径 -c copy -vbsf h264_mp4toannexb 目标ts文件 ffmpeg -i real.mp4 -c copy -vbsf h264_mp4toannexb output.ts 转码成功后会生成ts文件\n4、将ts切片，并生成m3u8文件 命令格式:\n1 2 3 4 5 6 7 ffmpeg -i output.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 5 output%03d.ts #output.ts 已生成的ts文件 #playlist.m3u8 待生成的m3u8文件名 #5 切片时间，表示隔几秒进行切一个文件 #output%03d.ts 生成切割ts文件名，output%03d.ts 代表生成output001.ts、output002.ts这样的格式， #03d 可以随意修改，占位符。 这里我新建一个文件夹用了存放切片的 m3u8和output.ts文件,那么命令则是\n1 ffmpeg -i output.ts -c copy -map 0 -f segment -segment_list void/playlist.m3u8 -segment_time 5 void/output%03d.ts 这样就算切片成功了，视频被切割成以5秒大小的ts文件。\n参考文章:\nhttps://blog.csdn.net/hejjunlin/article/details/71001593(FFmpeg总结（九）用ffmpeg进行切片生成m3u8索引文件)\nhttps://blog.csdn.net/yeyinglingfeng/article/details/7874932(使用ffmpeg将视频转为x264编码的mp4文件)\n","permalink":"https://blog.curlc.com/archives/514/","summary":"\u003cblockquote\u003e\n\u003cp\u003e在今年的任务计划中有一项是做一个视频网站，当然其中需要的就是将mp4转 m3u8 格式，为啥要转为m3u8呢？这是因为m3u8以片段的形式储存，快进的时候拉到哪就看哪，如果是完整的mp4文件，则需要全部下载，浪费服务器带宽和用户时间。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"1下载ffmpeg\"\u003e1、下载ffmpeg\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://ffmpeg.zeranoe.com/builds/\"\u003ehttps://ffmpeg.zeranoe.com/builds/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Windows上使用ffmpeg 进行视频切片\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/15/acf438fe332ba9a48c3abe26c0a569e0.png\"\u003e\u003c/p\u003e\n\u003cp\u003e下载完成后解压到任务目录(尽量不要有中文)\n然后设置bin目录到系统环境变量(path)\u003c/p\u003e\n\u003ch2 id=\"2对视频进行转码转为mp4\"\u003e2、对视频进行转码(转为MP4)\u003c/h2\u003e\n\u003cp\u003e为啥要转码呢？\n将视频文件转为视频编码h.264，音频编码aac格式的mp4文件\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg -i out.mp4  -c:v libx264 -strict -2 real.mp4\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eout.mp4 是待转码的文件(可以是其他格式，比如avi\u0026hellip;\u0026hellip;之类的)\nreal.mp4 是转码输出文件\nlibx264 转为 h.264编码\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e这里我为啥要讲mp4再转码一次呢？因为我这个mp4视频文件不是h.264编码，所以需要再转一次，不然到后面切片的时候会遇到很多莫名其妙的问题。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e这个过程一般比较长，根据电脑CPU和视频长度决定。当然也可以使用GPU进行转码，这样更快~\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Windows上使用ffmpeg 进行视频切片\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/15/bd66f3cd3a46dde33d3eed7968949fbf.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"3将mp4转换为ts格式文件单个ts\"\u003e3、\u003cstrong\u003e将MP4转换为ts格式文件(单个ts)\u003c/strong\u003e\u003c/h2\u003e\n\u003cp\u003e命令格式如下:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg -y -i 待转换mp4文件路径 -c copy -vbsf h264_mp4toannexb 目标ts文件\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg -i real.mp4 -c copy -vbsf h264_mp4toannexb output.ts\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e转码成功后会生成ts文件\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Windows上使用ffmpeg 进行视频切片\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/02/15/e3ade4729d39c36070ad5d249467bbd5.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"4将ts切片并生成m3u8文件\"\u003e4、将ts切片，并生成m3u8文件\u003c/h2\u003e\n\u003cp\u003e命令格式:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg -i output.ts -c copy -map \u003cspan class=\"m\"\u003e0\u003c/span\u003e -f segment -segment_list playlist.m3u8 -segment_time \u003cspan class=\"m\"\u003e5\u003c/span\u003e output%03d.ts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#output.ts 已生成的ts文件\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#playlist.m3u8 待生成的m3u8文件名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#5 切片时间，表示隔几秒进行切一个文件\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#output%03d.ts 生成切割ts文件名，output%03d.ts 代表生成output001.ts、output002.ts这样的格式，\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#03d 可以随意修改，占位符。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e这里我新建一个文件夹用了存放切片的 m3u8和output.ts文件,那么命令则是\u003c/p\u003e","title":"Windows上使用ffmpeg 进行视频切片"},{"content":"我自己是喜欢开openvz或者lxc架构的vps，因为比kvm占的资源少，这里我就用virtualizor开vps，比较方便点，当然也可以用**Proxmox **，这个是免费的。\n要求 CentOS 7.x yum / apt-get 存储以创建VPS（DomUs）磁盘 分区方案 划分 尺寸 描述\n/ 80-100 GB 根分区包含所有硬件节点操作系统文件，操作系统模板和ISO\n交换空间 4 GB + Linux操作系统的分页分区（如果实内存不足，虚拟服务器会使用交换内存）\n存储 硬盘上剩余的所有空间 此分区可用于为VPS（DomUs）创建逻辑卷。 LVM注意 ：您不能创建任何逻辑卷并安装它。这必须是一个空的卷组。 Virtualizor不会删除卷组中任何预先存在的LV。但它建议有一个空卷组。\n安装 1 2 3 4 打开Shell终端（例如PuTTY）并通过SSH连接到您的服务器。运行以下命令： wget -N http://files.virtualizor.com/install.sh chmod 0755 install.sh ./install.sh email=your@email.com kernel = lxc 请正确地给出电子邮件地址！\n注意 ：LXC处于测试阶段。目前不建议用于生产服务器。\n安装将立即开始。如果您的网络速度很慢，似乎安装已停止，但请继续。你会看到这样的东西： 安装完成后，系统会要求重新启动。 然后，您可以访问管理面板以创建存储和虚拟服务器，还可以管理您的服务器。 注意：将创建安装过程的日志文件 - /root/virtualizor.log\n登录 要登录Softaculous Virtualizor管理面板，请访问以下URL：\nhttps：//开头您-服务器IP：4085 /\nHTTP：//你的-服务器IP：4084 / 使用服务器root账号密码登录。 管理面板 登录后，将看到管理面板仪表板： 端口 Virtualizor使用4081 - 4085的端口。如果有任何防火墙限制此功能，需要允许这些端口。\n创建存储 在创建任何VM之前，必须定义存储。 Virtualizor Admin Panel -\u0026gt; Storage -\u0026gt; Add Storage 将看到以下向导： Storage Type ：储存类型 (这里使用LVM) Storage Path：储存路径(LVM卷组路径，每创建创建一个VM将会自动创建一个卷组) Overcommit：空间大小 填写详细信息并定义存储。\nLXC中的虚拟化网络 Virtualizor将创建一个viifbr0桥。 viifbr0从以下位置检测IP，网络掩码，网关：\n1 /etc/sysconfig/network-scripts/ifcfg-eth0 如果更改上述文件，则需要重新启动虚拟化网络：\n1 root\u0026gt; service virtnetwork restart 启动命令：\n1 root\u0026gt; service virtnetwork start 停止命令：\n1 root\u0026gt; service virtnetwork stop 添加IP 如果是ovh，则需要将填写ip对应的虚拟MAC\n创建VPS 系统默认带一个Centos6的系统，如果需要装其他的可以看下文。 以上VPS就创建好了，下面方式可以减少工作量~ 创建模板 当然，这里可以创建一个模板，然后就不用手动一个一个填了，添加模板的方式 Plans-Add Plans 添加系统 Media-Template Browser 选择与你想创建的虚拟化类型相同，不然无法使用。 当然这里的模板是官方提供的，如果想自己上传iso，就使用 Add ISO 功能，上传完成后就可以使用这个ISO了 或者复制一个VPS系统作为一个模板 Media-Create Template（可以自己上传ISO后，创建一个虚拟机，然后创建这个模板） 用virtualizor还算是比较简单的，价格也便宜，9刀一个月，可以创建无限的VPS数量。Proxmox也是蛮不错，就是需要ISO安装，在没有IPMI的机器就不好装了，下次试一下~\n附：OPENVZ 与 KVM 的区别 以下转自 http://banwagong.cn/ovz-kvm.html\n第一、OPENVZ架构普及知识 OpenVZ是基于Linux内核和作业系统的操作系统级虚拟化技术。OpenVZ允许物理服务器运行多个操作系统，被称虚拟专用服务器（VPS，Virtual Private Server）或虚拟环境（VE, Virtual Environment）。 OpenVZ软件同时为用户提供工具，协助自动化管理虚拟服务器。基于模板的应用程序部署可以在几分钟内用简单的方法创建新的虚拟服务器并投入使用，而且与其他的虚拟化技术相比，OpenVZ可以在每CPU上运行几倍于其他虚拟化服务器技术的虚拟化服务器。 OpenVZ可以在单个物理服务器上创建多个隔离的虚拟专用服务器(VPS)并以最大效率共享硬件和管理资源。每个VPS的运行和独立服务器完全一致，因其自身的用户、应用程序都可以独立重启，它拥有根访问权限、用户、IP地址、内存、处理器、文件、应用服务、系统库文件和配置文件等。拥有轻量级处理损耗和高效设计的OpenVZ是运行应用服务和实时数据生产型服务器虚拟化的最佳选择。 Tip： 最简单，我们可以看到OPENVZ VPS是比较便宜的。\n第二、KVM架构普及知识 KVM作为内核的一个模块，来提供虚拟化功能。如果系统需要虚拟化功能，则KVM模块可以被Linux内核按需动态加载到内存运行。如果不需要的KVM功能，可以动态卸载该模块。 KVM是嵌入在Linux操作系统标准内核中的一个虚拟化模块，它能够将一个Linux标准内核转换成为一个VMM，嵌有KVM模块的Linux标准内核可以支持通过kvm tools来进行加载的GuestOS。所以在这样的操作系统平台下，计算机物理硬件层上直接就是VMM虚拟化层，而没有独立出来的HostOS操作系统层。 kvm 是完全虚拟的，所以不分 pv 和 hvm 的区别，所有的 kvm 类型的虚拟技术都可以装各种 linux 的发行版和各种 win 的发行版，不管供应商在主页有没有写明是否支持 win，只要你配置够 win 运行，那就肯定可以装的上去，只是方法的问题而已。\n第三、OPENVZ 与 KVM 缺点比较 OPENVZ - 超卖，没有不超卖的，导致各种石头盘，钻石盘。连带的 cpu 也被过度分割导致性能升值不如其标明的 1/10。再有就是内存，基本上 OpenVZ 技术没有独占的，都是共享，别人多了你就少了，而且这种技术最大的劣势就是内存下来后直接就是当机。 KVM - KVM 资源占用也看周边邻居的资源使用情况，如果折腾的用户太多，也会导致自己的不稳定。简单一点，比如搬瓦工商家才开始销售KVM机器，我们可以看到稳定性还是不错的，就看以后是否有大量的折腾用户进来，如果是，那会给我们有不小的影响。\n","permalink":"https://blog.curlc.com/archives/481/","summary":"\u003cp\u003e我自己是喜欢开openvz或者lxc架构的vps，因为比kvm占的资源少，这里我就用\u003cstrong\u003evirtualizor\u003c/strong\u003e开vps，比较方便点，当然也可以用**Proxmox **，这个是免费的。\u003c/p\u003e\n\u003ch3 id=\"要求\"\u003e要求\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eCentOS 7.x\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eyum / apt-get\u003c/li\u003e\n\u003cli\u003e存储以创建VPS（DomUs）磁盘\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"分区方案\"\u003e分区方案\u003c/h3\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e划分\n尺寸\n描述\u003c/p\u003e\n\u003cp\u003e     /\n80-100 GB\n根分区包含所有硬件节点操作系统文件，操作系统模板和ISO\u003c/p\u003e\n\u003cp\u003e交换空间\n4 GB +\nLinux操作系统的分页分区（如果实内存不足，虚拟服务器会使用交换内存）\u003c/p\u003e\n\u003cp\u003e  存储\n硬盘上剩余的所有空间\n此分区可用于为VPS（DomUs）创建\u003cstrong\u003e逻辑卷\u003c/strong\u003e。\n\u003cstrong\u003eLVM注意\u003c/strong\u003e  ：您不能创建任何逻辑卷并安装它。这必须是一个空的卷组。\nVirtualizor不会删除卷组中任何预先存在的LV。但它建议有一个空卷组。\u003c/p\u003e\n\u003ch3 id=\"安装\"\u003e安装\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e打开Shell终端（例如PuTTY）并通过SSH连接到您的服务器。运行以下命令：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget -N http://files.virtualizor.com/install.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003echmod 0755 install.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./install.sh email=your@email.com kernel = lxc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e请正确地给出电子邮件地址！\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e注意\u003c/strong\u003e  ：LXC处于测试阶段。目前不建议用于生产服务器。\u003c/p\u003e\n\u003cp\u003e \n安装将立即开始。如果您的网络速度很慢，似乎安装已停止，但请继续。你会看到这样的东西：\n\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/01/28/b8a165820bebbded83fafcf48f59049e.png\"\u003e\u003c/p\u003e\n\u003cp\u003e安装完成后，系统会要求重新启动。\n \n\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/01/28/440e271388c1b341166856603b4f1db9.png\"\u003e\u003c/p\u003e\n\u003cp\u003e然后，您可以访问管理面板以创建存储和虚拟服务器，还可以管理您的服务器。\n    注意：将创建安装过程的日志文件 - /root/virtualizor.log\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003ch3 id=\"登录\"\u003e登录\u003c/h3\u003e\n\u003cp\u003e要登录Softaculous Virtualizor管理面板，请访问以下URL：\u003c/p\u003e\n\u003cp\u003ehttps：//开头您-服务器IP：4085 /\u003c/p\u003e\n\u003cp\u003eHTTP：//你的-服务器IP：4084 /\n使用服务器root账号密码登录。\n\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/01/28/4f1ab7ad27c05a91d52e74f16755b313.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"管理面板\"\u003e管理面板\u003c/h3\u003e\n\u003cp\u003e登录后，将看到管理面板仪表板：\n\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/01/28/8d1a42b09d85e20e28594be1b6d8316d.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"端口\"\u003e端口\u003c/h3\u003e\n\u003cp\u003eVirtualizor使用4081 - 4085的端口。如果有任何防火墙限制此功能，需要允许这些端口。\u003c/p\u003e\n\u003ch3 id=\"创建存储\"\u003e创建存储\u003c/h3\u003e\n\u003cp\u003e在创建任何VM之前，必须定义存储。\nVirtualizor Admin Panel -\u0026gt; Storage -\u0026gt; Add Storage\n将看到以下向导：\n\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/01/28/536d9ef15041a9757072351248e5358e.png\"\u003e\u003c/p\u003e","title":"Centos7安装virtualizor开lxc小鸡"},{"content":"最近上手一台OVH杜甫，结果在配置IP的时候不小心配置错了，导致网络无法连接，这个时候肯定去后台下载OVH的IPMI文件，这个时候问题来了，下载成功了，也加载了jar文件，但是无法连接报错 Connection failed。\n想了一下，OVH到国内到网络并不好，可能是网络导致的，我就用\u0026quot;代理\u0026quot;打开，结果也不行(包括全局代理)，只能用最终的办法\n开一台国外的VPS，在进行连接，果然，这就好了~\n","permalink":"https://blog.curlc.com/archives/479/","summary":"\u003cp\u003e最近上手一台OVH杜甫，结果在配置IP的时候不小心配置错了，导致网络无法连接，这个时候肯定去后台下载OVH的IPMI文件，这个时候问题来了，下载成功了，也加载了jar文件，但是无法连接报错 Connection failed。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"ipmi报错\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/01/19/5b5c81973804d12a1376d2e4aa544818.png\"\u003e\u003c/p\u003e\n\u003cp\u003e想了一下，OVH到国内到网络并不好，可能是网络导致的，我就用\u0026quot;代理\u0026quot;打开，结果也不行(包括全局代理)，只能用最终的办法\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e开一台国外的VPS\u003c/strong\u003e，在进行连接，果然，这就好了~\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"ipmi连接成功\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/01/19/5559340668b81b1d9d1412e495a857cd.png\"\u003e\u003c/p\u003e","title":"记一次OVH的IPMI无法连接问题"},{"content":"现在免费使用了，在 https://github.com/pricing 页面多了 Unlimited private repositories 一栏，无限的私人存储库。 免费版服务将合作者数量限制为最多3人，且不提供bug跟踪和高级代码审查服务。\n企业服务的价格为每月21美元，包含了Team级服务（每月收费9美元）的一切功能，同时允许用户选择使用自托管或云托管，并提供SAML单点登录、发票结算、访问配置等更多服务，企业云服务承诺99.95%的正常运行时间。\n微软的 Azure Repos 也提供 无限制免费专用(私有)存储库，地址： https://azure.microsoft.com/zh-cn/services/devops/repos/\n","permalink":"https://blog.curlc.com/archives/476/","summary":"\u003cp\u003e现在免费使用了，在 \u003ca href=\"https://github.com/pricing\"\u003ehttps://github.com/pricing\u003c/a\u003e 页面多了 \u003cstrong\u003eUnlimited private repositories\u003c/strong\u003e 一栏，无限的私人存储库。\n免费版服务将合作者数量限制为最多3人，且不提供bug跟踪和高级代码审查服务。\u003c/p\u003e\n\u003cp\u003e企业服务的价格为每月21美元，包含了Team级服务（每月收费9美元）的一切功能，同时允许用户选择使用自托管或云托管，并提供SAML单点登录、发票结算、访问配置等更多服务，企业云服务承诺99.95%的正常运行时间。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"详情\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/01/08/7be0e59b77d024f992fa133119e4f0e7.png\"\u003e\u003c/p\u003e\n\u003cp\u003e微软的 Azure Repos 也提供 无限制免费专用(私有)存储库，地址：\n\u003ca href=\"https://azure.microsoft.com/zh-cn/services/devops/repos/\"\u003ehttps://azure.microsoft.com/zh-cn/services/devops/repos/\u003c/a\u003e\u003c/p\u003e","title":"github私有库免费了"},{"content":"1、CF SSL的三种模式 1 2 3 4 5 Off: 关闭证书 Flexible: 由CF提供证书 后端无需启用 Full: 由CF提供证书 后端需要安装证书 可以是自签证书 Full(strict): 由CF提供证书 后端需要安装证书 需要可信证书/CF提供的15年自签证书? 80跳443和www跳non-www CF和后端选一个设置即可 不用两边都设置 1 2 3 4 CF提供的证书 sni.cloudflaressl.com: 合作伙伴接入 一个网站一个证书 免费和收费套餐有没有区别不知道 snixxxxxx.cloudflaressl.com 官方接入免费套餐 多域名共用 通配符 sslxxxxxx.cloudflaressl.com 官方接入收费套餐 单域名 通配符 CF提供的收费通配符证书 显示自己域名 只能在CF上启用 无法安装在后端 5刀起步\n在CF上上传自定义证书 200刀起步\nCF IP地址区别 1 2 3 4 104头: 免费和收费套餐 除企业版 198头: 企业版 高级节点请加钱 国内节点加钱企业版并北岸 网站不显示绿锁自行检查网站引用资源 替换http为https 上文转载至 陈道临 ：https://www.hostloc.com/forum.php?mod=redirect\u0026amp;goto=findpost\u0026amp;ptid=480054\u0026amp;pid=5868278\n2、SSL选项设置 比如 https://censys.io 可以扫描出CF下的IP\n原理就是扫全网IP的443，记录下都返回什么证书\n如果套CF，SSL选Full（别选Strict），配个无效证书就防这家扫了，可以防止全网扫描，\n上文转自 shiro :https://www.hostloc.com/forum.php?mod=redirect\u0026amp;goto=findpost\u0026amp;ptid=508388\u0026amp;pid=6209432\n3、使用cloudflare 提供的证书 如果选择的是Full(否则可以不用管),那么源站的证书从CF里面生成15年证书，然后进行下载并在源站上使用。\n位置：Crypto-Origin Certificates\n","permalink":"https://blog.curlc.com/archives/472/","summary":"\u003ch2 id=\"1cf-ssl的三种模式\"\u003e1、CF SSL的三种模式\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOff: 关闭证书\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFlexible: 由CF提供证书 后端无需启用\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFull: 由CF提供证书 后端需要安装证书 可以是自签证书\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFull(strict): 由CF提供证书 后端需要安装证书 需要可信证书/CF提供的15年自签证书?\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e80跳443和www跳non-www CF和后端选一个设置即可 不用两边都设置\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCF提供的证书\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esni.cloudflaressl.com: 合作伙伴接入 一个网站一个证书 免费和收费套餐有没有区别不知道\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esnixxxxxx.cloudflaressl.com 官方接入免费套餐 多域名共用 通配符\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esslxxxxxx.cloudflaressl.com 官方接入收费套餐 单域名 通配符\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003eCF提供的收费通配符证书 显示自己域名 只能在CF上启用 无法安装在后端 5刀起步\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.loli.net/2018/10/02/5bb310d9a4079.png\"\u003e\u003c/p\u003e\n\u003cp\u003e在CF上上传自定义证书 200刀起步\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://i.loli.net/2018/10/02/5bb3165114bbc.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"cf-ip地址区别\"\u003eCF IP地址区别\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e104头: 免费和收费套餐 除企业版\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e198头: 企业版\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e高级节点请加钱 国内节点加钱企业版并北岸\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e网站不显示绿锁自行检查网站引用资源 替换http为https\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e上文转载至 陈道临 ：https://www.hostloc.com/forum.php?mod=redirect\u0026amp;goto=findpost\u0026amp;ptid=480054\u0026amp;pid=5868278\u003c/p\u003e","title":"cloudflare 设置SSL注意事项"},{"content":"一、概述 nginx官方文档给出location语法如下： location [=||*|^~] uri { … } 其中，方括号中的四种标识符是可选项，用来改变请求字符串和uri的匹配方式。uri是待匹配的请求字符串，可以是不包含正则的字符串，这种模式被称为“标准的uri\u0026quot;；也可以包含正则，这种模式被称为\u0026quot;正则uri\u0026quot;，如下：\n1 2 location ~ .*\\.(php|php5)?$ { } 二、四种可选的标识符 标识符 描述 = 精确匹配；用于标准uri前，要求请求字符串和uri严格匹配。如果匹配成功，就停止匹配，立即执行该location里面的请求。 ~ 正则匹配；用于正则uri前，表示uri里面包含正则，并且区分大小写。 * 正则匹配；用于正则uri前，表示uri里面包含正则，不区分大小写。 ^ 非正则匹配；用于标准uri前，nginx服务器匹配到前缀最多的uri后就结束，该模式匹配成功后，不会使用正则匹配。 无 普通匹配（最长字符匹配）；与location顺序无关，是按照匹配的长短来取匹配结果。若完全匹配，就停止匹配。 备注： 1、如果uri里面包含正则表达式，就必须使用或*标识符； 2、针对和匹配标识符，可以在前面加上!来取反，如下： !~ 表示正则不匹配，区分大小写。 !~ 表示正则不匹配，不区分大小写。 2.1 “=”精准匹配案例\n1 2 3 location = /login { # 精确匹配 /login ，匹配成功后，立即结束 } 2.2 “~”区分大小写正则匹配案例\n1 2 3 location ~ /images/ { #正则匹配，区分大小写，匹配成功后，立即结束 } 2.3 “~*”不区分大小写正则匹配案例\n1 2 3 location ~* /images/ { #正则匹配，不区分大小写，匹配成功后，立即结束 } 2.4 “^~” 不进行正则匹配的标准匹配\n1 2 3 location ^~ /images/ { # 匹配任何以 /images/ 开头的地址，匹配符合以后，停止往下搜索正则，采用这一条。 } 2.5 普通匹配（最长字符匹配）\n1 2 3 4 location /blog/ { # 与location顺序无关 # 若完全匹配成功，就不在继续匹配，否则还会进行正则匹配 } 三、location匹配顺序 在没有标识符的请求下，匹配规则如下： 1、nginx服务器首先在server块的多个location块中搜索是否有标准的uri和请求字符串匹配。如果有多个标准uri可以匹配，就匹配其中匹配度最高的一个location。 2、然后，nginx在使用location块中，正则uri和请求字符串，进行匹配。如果正则匹配成功，则结束匹配，并使用这个location处理请求；如果正则匹配失败，则使用标准uri中，匹配度最高的location。 备注： 1、如果有精确匹配，会先进行精确匹配，匹配成功，立刻返回结果。 2、普通匹配与顺序无关，因为按照匹配的长短来取匹配结果。 3、正则匹配与顺序有关，因为是从上往下匹配。(首先匹配，就结束解析过程) 4、在location中，有一种统配的location，所有的请求，都可以匹配，如下：\n1 2 3 4 location / { # 因为所有的地址都以 / 开头，所以这条规则将匹配到所有请求 # 但是正则和最长字符串会优先匹配 } 结合标识符，匹配顺序如下： (location =) \u0026gt; (location 完整路径) \u0026gt; (location ^~ 路径) \u0026gt; (location ,* 正则顺序) \u0026gt; (location 部分起始路径) \u0026gt; (location /) 即 （精确匹配）\u0026gt; (最长字符串匹配，但完全匹配) \u0026gt;（非正则匹配）\u0026gt;（正则匹配）\u0026gt;（最长字符串匹配，不完全匹配）\u0026gt;（location通配）\n五、案例 假设，现有如下一些规则：\n1 2 3 4 location = / { //精确匹配/ ，主机名后面不能带任何字符串 echo \u0026#34;规则A\u0026#34;; } 1 2 3 4 location = /login { //精确匹配 /login 开头的地址，匹配符合以后，不在继续往下搜索 echo \u0026#34;规则B\u0026#34;; } 1 2 3 4 location ^~ /blog/ { //非正则匹配，匹配/blog/后，停止往下搜索正则，采用这一条 echo \u0026#34;规则C\u0026#34;; } 1 2 3 4 location ~ \\.(gif|jpg|png|js|css)$ { //区分大小写的正则匹配 若匹配成功，停止往下搜索正则，采用这一条 echo \u0026#34;规则D\u0026#34;; } 1 2 3 4 location ~* \\.png$ { //区分大小写的正则匹配 ，停止往下搜索正则，采用这一条 echo \u0026#34;规则E\u0026#34;; } 1 2 3 4 5 location / { //因为所有的地址都以 / 开头，所以这条规则将匹配到所有请求 //如果没任何规则匹配上，就采用这条规则 echo \u0026#34;规则F\u0026#34;; } 1 2 3 4 location /blog/detail { //最长字符串匹配，若完全匹配成功，就不在继续匹配，否则还会进行正则匹配 echo \u0026#34;规则G\u0026#34;; } 1 2 3 4 location /images { //最长字符串匹配，同上 echo \u0026#34;规则Y\u0026#34;; } 1 2 3 4 location ^~ /static/files { //非正则匹配，若匹配成功，就不在继续匹配 echo \u0026#34;规则X\u0026#34;; } 1、当访问根路径/的时候，比如http://www.findme.wang/ ，会匹配规则A。\n2、当访如http://www.findme.wang/login ，会匹配规则B。\n3、当访如http://www.findme.wang/login.html ，会匹配规则F。\n4、当访如http://www.findme.wang/blog/detail/3.html ，会匹配规则C。分析思路，首先看看，“精确匹配”是否可以匹配成功，显示不可以；然后，看看是否可以“普通匹配”是否可以完全匹配，显示也没有；接着在看看非正则匹配，是否可以匹配成功，发现同规则C匹配上了，所以采用了规则C。\n本文为转载，转载地址:http://www.findme.wang/blog/detail/id/495.html\n","permalink":"https://blog.curlc.com/archives/456/","summary":"\u003ch2 id=\"一概述\"\u003e一、概述\u003c/h2\u003e\n\u003cp\u003enginx官方文档给出location语法如下：\nlocation [=|\u003cdel\u003e|\u003c/del\u003e*|^~] uri { … }\n其中，方括号中的四种标识符是可选项，用来改变请求字符串和uri的匹配方式。uri是待匹配的请求字符串，可以是不包含正则的字符串，这种模式被称为“标准的uri\u0026quot;；也可以包含正则，这种模式被称为\u0026quot;正则uri\u0026quot;，如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elocation ~ .*\\.(php|php5)?$ {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"二四种可选的标识符\"\u003e二、四种可选的标识符\u003c/h2\u003e\n\u003cp\u003e标识符 描述\n= 精确匹配；用于标准uri前，要求请求字符串和uri严格匹配。如果匹配成功，就停止匹配，立即执行该location里面的请求。\n~ 正则匹配；用于正则uri前，表示uri里面包含正则，并且区分大小写。\n\u003cdel\u003e* 正则匹配；用于正则uri前，表示uri里面包含正则，不区分大小写。\n^\u003c/del\u003e 非正则匹配；用于标准uri前，nginx服务器匹配到前缀最多的uri后就结束，该模式匹配成功后，不会使用正则匹配。\n无 普通匹配（最长字符匹配）；与location顺序无关，是按照匹配的长短来取匹配结果。若完全匹配，就停止匹配。\n备注：\n1、如果uri里面包含正则表达式，就必须使用\u003cdel\u003e或\u003c/del\u003e*标识符；\n2、针对\u003cdel\u003e和\u003c/del\u003e\u003cem\u003e匹配标识符，可以在前面加上!来取反，如下：\n!~ 表示正则不匹配，区分大小写。\n!~\u003c/em\u003e 表示正则不匹配，不区分大小写。\n2.1 “=”精准匹配案例\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elogin\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e# 精确匹配 /login ，匹配成功后，立即结束\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e2.2 “~”区分大小写正则匹配案例\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e~\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eimages\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#正则匹配，区分大小写，匹配成功后，立即结束\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e2.3 “~*”不区分大小写正则匹配案例\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e~*\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eimages\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#正则匹配，不区分大小写，匹配成功后，立即结束\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e2.4 “^~” 不进行正则匹配的标准匹配\u003c/p\u003e","title":"nginx配置中location匹配规则详解"},{"content":"有时候看日志经常看到很多扫描工具啊、爆破等等、这里突然想到可以用Nginx自带的auth_basic 来给登录页面 wp-login.php再做一个验证，这样可以避免扫描工具一直扫。\n1、生成认证的用户名与密码 这一点在这篇 nginx添加认证,使通过密码访问页面 文章中说过了，就不再写了\n2、修改nginx 伪静态 增加以下\n1 2 3 4 5 6 7 8 9 location = /wp-login.php { auth_basic \u0026#34;Protected Elasticsearch\u0026#34;; auth_basic_user_file /www/nginx_passwd; #设置php解析php，不然认证成功后就是直接下载php文件了，因为这里用了精准匹配，优先匹配 #这里根据自己的情况来设置,不知道怎么写就去看一下默认解析php的地方 fastcgi_pass unix:/tmp/php-cgi-72.sock; #fastcgi_index wp-login.php; include fastcgi.conf; } 3、重载 Ningx 1 service nginx reload ","permalink":"https://blog.curlc.com/archives/455/","summary":"\u003cp\u003e有时候看日志经常看到很多扫描工具啊、爆破等等、这里突然想到可以用Nginx自带的auth_basic 来给登录页面 wp-login.php再做一个验证，这样可以避免扫描工具一直扫。\u003c/p\u003e\n\u003ch2 id=\"1生成认证的用户名与密码\"\u003e1、生成认证的用户名与密码\u003c/h2\u003e\n\u003cp\u003e这一点在这篇 \u003ca href=\"https://blog.curlc.com/archives/403.html\"\u003enginx添加认证,使通过密码访问页面\u003c/a\u003e 文章中说过了，就不再写了\u003c/p\u003e\n\u003ch2 id=\"2修改nginx-伪静态\"\u003e2、修改nginx 伪静态\u003c/h2\u003e\n\u003cp\u003e增加以下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e9\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elogin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eauth_basic\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Protected Elasticsearch\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eauth_basic_user_file\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewww\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003enginx_passwd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"cp\"\u003e#设置php解析php，不然认证成功后就是直接下载php文件了，因为这里用了精准匹配，优先匹配\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"cp\"\u003e#这里根据自己的情况来设置,不知道怎么写就去看一下默认解析php的地方\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efastcgi_pass\u003c/span\u003e \u003cspan class=\"nl\"\u003eunix\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecgi\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e72.\u003c/span\u003e\u003cspan class=\"n\"\u003esock\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"cp\"\u003e#fastcgi_index wp-login.php;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003einclude\u003c/span\u003e \u003cspan class=\"n\"\u003efastcgi\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econf\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"3重载-ningx\"\u003e3、重载 Ningx\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eservice nginx reload\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"Nginx使用auth_basic 保护wordpress 登录页面"},{"content":" 我们平时都听过非对称加密，公钥和私钥，签名验证，但这些证书都是怎么得到的呢？本篇文章会解答这些问题。\n背景介绍 加密的一个简单但又实用的任务就是发送加密电子邮件。多年来，为电子邮件进行加密的标准一直是PGP（Pretty Good Privacy）。程序员Phil Zimmermann特别为电子邮件的保密编写的PGP。 这个软件非常好用，迅速流传开来，成了许多程序员的必备工具。但是，它是商业软件，不能自由使用。 作为PGP的替代，如今已经有一个开放源代码的类似产品可供使用。GPG（Gnu Privacy Guard），它不包含专利算法，能够无限制的用于商业应用。 本文将会介绍文件加密，至于GPG的其他用途，比如邮件加密，请参考这个网站https://help.ubuntu.com\n安装 本人使用mac电脑，因此使用brew安装的，很简单，打开终端，输入brew install gpg就行了，至于其他的平台，可以自行搜索。\n1 2 3 4 5 bogon:~ XXXX$ brew install gpg ==\u0026gt; Downloading https://homebrew.bintray.com/bottles/gnupg-1.4.20.el_capitan.bot ######################################################################## 100.0% ==\u0026gt; Pouring gnupg-1.4.20.el_capitan.bottle.tar.gz ? /usr/local/Cellar/gnupg/1.4.20: 53 files, 5.4M 安装完成后，键入命令gpg --help:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 bogon:~ XXXX$ gpg --help gpg (GnuPG) 1.4.20 Copyright (C) 2015 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later \u0026lt;http://gnu.org/licenses/gpl.html\u0026gt; This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Home: ~/.gnupg 支持的算法： 公钥：RSA, RSA-E, RSA-S, ELG-E, DSA 对称加密：IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256 散列：MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224 压缩：不压缩, ZIP, ZLIB, BZIP2 语法：gpg [选项] [文件名] 签名、检查、加密或解密 默认的操作依输入数据而定 指令： -s, --sign [文件名] 生成一份签名 --clearsign [文件名] 生成一份明文签名 -b, --detach-sign 生成一份分离的签名 -e, --encrypt 加密数据 -c, --symmetric 仅使用对称加密 -d, --decrypt 解密数据(默认) --verify 验证签名 --list-keys 列出密钥 --list-sigs 列出密钥和签名 --check-sigs 列出并检查密钥签名 --fingerprint 列出密钥和指纹 -K, --list-secret-keys 列出私钥 --gen-key 生成一副新的密钥对 --delete-keys 从公钥钥匙环里删除密钥 --delete-secret-keys 从私钥钥匙环里删除密钥 --sign-key 为某把密钥添加签名 --lsign-key 为某把密钥添加本地签名 --edit-key 编辑某把密钥或为其添加签名 --gen-revoke 生成一份吊销证书 --export 导出密钥 --send-keys 把密钥导出到某个公钥服务器上 --recv-keys 从公钥服务器上导入密钥 --search-keys 在公钥服务器上搜寻密钥 --refresh-keys 从公钥服务器更新所有的本地密钥 --import 导入/合并密钥 --card-status 打印智能卡状态 --card-edit 更改智能卡上的数据 --change-pin 更改智能卡的 PIN --update-trustdb 更新信任度数据库 --print-md 算法 [文件] 使用指定的散列算法打印报文散列值 选项： -a, --armor 输出经 ASCII 封装 -r, --recipient 某甲 为收件者“某甲”加密 -u, --local-user 使用这个用户标识来签名或解密 -z N 设定压缩等级为 N (0 表示不压缩) --textmode 使用标准的文本模式 -o, --output 指定输出文件 -v, --verbose 详细模式 -n, --dry-run 不做任何改变 -i, --interactive 覆盖前先询问 --openpgp 行为严格遵循 OpenPGP 定义 --pgp2 生成与 PGP 2.x 兼容的报文 (请参考在线说明以获得所有命令和选项的完整清单) 范例： -se -r Bob [文件名] 为 Bob 这个收件人签名及加密 --clearsign [文件名] 做出明文签名 --detach-sign [文件名] 做出分离式签名 --list-keys [某甲] 显示密钥 --fingerprint [某甲] 显示指纹 请向 \u0026lt;gnupg-bugs@gnu.org\u0026gt; 报告程序缺陷。 请向 \u0026lt;i18n-zh@googlegroups.com\u0026gt; 反映简体中文翻译的问题。 这些帮助信息非常有用，下边演示的很多功能也是基于上边这些参数的。这里把他们列出来，方便在使用的时候查询。 如果能够显示上边的信息，说明GPG安装成功了\n生成密钥 利用上边的帮助信息中--gen-key 生成一副新的密钥对 可以生成密钥。 安装成功后，使用gen-ken参数生成自己的密钥。在终端中输入：\n1 gpg --gen-key 回车后，会看到：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 gpg (GnuPG) 1.4.20; Copyright (C) 2015 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. gpg: 已创建目录‘/Users/machao/.gnupg’ gpg: 新的配置文件‘/Users/machao/.gnupg/gpg.conf’已建立 gpg: 警告：在‘/Users/machao/.gnupg/gpg.conf’里的选项于此次运行期间未被使用 gpg: 钥匙环‘/Users/machao/.gnupg/secring.gpg’已建立 gpg: 钥匙环‘/Users/machao/.gnupg/pubring.gpg’已建立 请选择您要使用的密钥种类： (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (仅用于签名) (4) RSA (仅用于签名) 您的选择？ 第一段是版权声明，然后让用户自己选择加密算法。默认选择第一个选项，表示加密和签名都使用RSA算法。我们输入1,然后回车\n1 2 RSA 密钥长度应在 1024 位与 4096 位之间。 您想要用多大的密钥尺寸？ 这一步要让我们输入密钥长度，长度越长越安全,默认为2048。我们输入2048回车\n1 2 3 4 5 6 7 8 您所要求的密钥尺寸是 2048 位 请设定这把密钥的有效期限。 0 = 密钥永不过期 \u0026lt;n\u0026gt; = 密钥在 n 天后过期 \u0026lt;n\u0026gt;w = 密钥在 n 周后过期 \u0026lt;n\u0026gt;m = 密钥在 n 月后过期 \u0026lt;n\u0026gt;y = 密钥在 n 年后过期 密钥的有效期限是？(0) 如果密钥只是个人使用，并且你很确定可以有效保管私钥，建议选择第一个选项，即永不过期。注意，如果想设置在2年后过期，那么应该输入2y,然后回车 回答完上面三个问题以后，系统让你确认。\n1 2 密钥于 日 10/ 8 11:20:32 2017 CST 过期 以上正确吗？(y/n)y 到这里，我们对要生成的密钥的配置已经完成了，然后我们还需要一个标识，\n1 2 3 您需要一个用户标识来辨识您的密钥；本软件会用真实姓名、注释和电子邮件地址组合 成用户标识，如下所示： “Heinrich Heine (Der Dichter) \u0026lt;heinrichh@duesseldorf.de\u0026gt;” 按照要求依次输入就行了\n1 2 3 真实姓名： 电子邮件地址： 注释： 我们这里假设输入的信息为：\n1 2 3 真实姓名：Zhang San 电子邮件地址：zhangsan@163.com 注释： 回车后：\n1 2 3 您选定了这个用户标识： “Zhang San \u0026lt;zhangsan@163.com\u0026gt;” 更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)？ 我们输入o,回车后\n1 您需要一个密码来保护您的私钥。 然后输入密码，再次确认密码后，\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动 鼠标、读写硬盘之类的)，这会让随机数字发生器有更好的机会获得足够的熵数。 .+++++ ...+++++ 我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动 鼠标、读写硬盘之类的)，这会让随机数字发生器有更好的机会获得足够的熵数。 ....................+++++ ...........+++++ gpg: /Users/XXXX/.gnupg/trustdb.gpg：建立了信任度数据库 gpg: 密钥 74A64469 被标记为绝对信任 公钥和私钥已经生成并经签名。 gpg: 正在检查信任度数据库 gpg: 需要 3 份勉强信任和 1 份完全信任，PGP 信任模型 gpg: 深度：0 有效性： 1 已签名： 0 信任度：0-，0q，0n，0m，0f，1u gpg: 下次信任度数据库检查将于 2017-10-08 进行 pub 2048R/74A64469 2016-10-08 [有效至：2017-10-08] 密钥指纹 = 2187 78CA 2E78 83C2 039C E47B D94A 622A 74A6 5569 uid Zhang San \u0026lt;zhangsan@163.com\u0026gt; sub 2048R/490E5BC8 2016-10-08 [有效至：2017-10-08] 请注意上面的字符串\u0026quot;74A64469\u0026quot;，这是\u0026quot;用户ID\u0026quot;的Hash字符串，可以用来替代\u0026quot;用户ID\u0026quot;。到此为止，我们已经完成了生成公钥和私钥的任务了,文件在/Users/XXXX/.gnupg/pubring.gpg。 这时，最好再生成一张\u0026quot;撤销证书\u0026quot;，以备以后密钥作废时，可以请求外部的公钥服务器撤销你的公钥。\n1 gpg --gen-revoke 74A64469 然后按照下边的步骤依次执行就行了\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 sec 2048R/74A64469 2016-10-08 Zhang San \u0026lt;zhangsan@163.com\u0026gt; 要为这把密钥建立一份吊销证书吗？(y/N)y 请选择吊销的原因： 0 = 未指定原因 1 = 密钥已泄漏 2 = 密钥被替换 3 = 密钥不再使用 Q = 取消 (也许您会想要在这里选择 1) 您的决定是什么？0 请输入描述(可选)；以空白行结束： \u0026gt; 吊销原因：未指定原因 (不给定描述) 这样可以吗？ (y/N)y 您需要输入密码，才能解开这个用户的私钥：“Zhang San \u0026lt;zhangsan@163.com\u0026gt;” 2048 位的 RSA 密钥，钥匙号 74A64469，建立于 2016-10-08 已强行使用 ASCII 封装过的输出。 已建立吊销证书。 请把这个文件转移到一个可隐藏起来的介质(如软盘)上；如果坏人能够取得这 份证书的话，那么他就能让您的密钥无法继续使用。把这份凭证打印出来再藏 到安全的地方也是很好的方法，以免您的保存媒体损毁而无法读取。但是千万 小心：您的机器上的打印系统可能会在打印过程中把这些数据临时在某个其他 人也能够看得到的地方！ -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 Comment: A revocation certificate should follow iQEfBCABAgAJBQJX+GqQAh0AAAoJENlKYip0plVp0q8H/jDfnm8ElhgN+5dgn7uu wrbgDMBrtFzuxqGPPlTTJLHprUQUuQBG3uMPjQCCh52fMY8DUAjlcsAcynpMYLll 2mdHPdWC7SDK/qPhZ2AGO+iJ333I3Ir4vYfjEdNetyD6ZfBpk7m1rqz3BYtBey5N 6FSrLXyaNu88ftwozqxBqRZE2b09boafX5y/UrgHpco13a8DdredSN49D0d3EwxZ e78reDEpE4kwh4E0xAEXnX4ILDCSnTz4S8wGFV8uddB4Snyh8m+HiuDlp7h9kYw+ c5BMSgSG/DxFAdIpetfdMMVtsAMTTy+nfMvIXWNFjARSEErW5Fz0TqkFhyT3Ntxu glE= =ee65 -----END PGP PUBLIC KEY BLOCK----- 查看密钥列表 list-keys参数列出系统中已有的密钥\n1 gpg --list-keys 回车后：\n1 2 3 4 5 /Users/XXXX/.gnupg/pubring.gpg -------------------------------- pub 2048R/74A64469 2016-10-08 [有效至：2017-10-08] uid Zhang San \u0026lt;zhangsan@163.com\u0026gt; sub 2048R/490E5BC8 2016-10-08 [有效至：2017-10-08] 第一行显示公钥文件名（pubring.gpg），第二行显示公钥特征（4096位，Hash字符串和生成时间），第三行显示\u0026quot;用户ID\u0026quot;，第四行显示私钥特征。 如果你要从密钥列表中删除某个密钥，可以使用delete-key参数。\n1 gpg --delete-key [用户ID] 输出密钥 公钥文件（.gnupg/pubring.gpg）以二进制形式储存，armor参数可以将其转换为ASCII码显示。\n1 gpg --armor --output public-key.txt --export [用户ID] \u0026ldquo;用户ID\u0026quot;指定哪个用户的公钥，output参数指定输出文件名（public-key.txt）。 类似地，export-secret-keys参数可以转换私钥。\n1 gpg --armor --output private-key.txt --export-secret-keys 打开public-key.txt private-key.txt 就能看到公钥和私钥了。\n上传公钥 公钥服务器是网络上专门储存用户公钥的服务器。send-keys参数可以将公钥上传到服务器\n1 gpg --send-keys [用户ID] --keyserver hkp://subkeys.pgp.net 使用上面的命令，你的公钥就被传到了服务器subkeys.pgp.net，然后通过交换机制，所有的公钥服务器最终都会包含你的公钥。 由于公钥服务器没有检查机制，任何人都可以用你的名义上传公钥，所以没有办法保证服务器上的公钥的可靠性。通常，你可以在网站上公布一个公钥指纹，让其他人核对下载到的公钥是否为真。fingerprint参数生成公钥指纹。\n1 gpg --fingerprint [用户ID] 输入密钥 除了生成自己的密钥，还需要将他人的公钥或者你的其他密钥输入系统。这时可以使用import参数。\n1 gpg --import [密钥文件] 为了获得他人的公钥，可以让对方直接发给你，或者到公钥服务器上寻找。\n1 gpg --keyserver hkp://subkeys.pgp.net --search-keys [用户ID] 正如前面提到的，我们无法保证服务器上的公钥是否可靠，下载后还需要用其他机制验证．\n加密和解密 我们演示加密和解密的过程，这个过程是对文件进行的。假如我们有一个test.txt文件。这个文件中的内容为：\n1 2 3 张飞，我爱你，今晚约吗？ 床前明月光，疑是地上霜。 举头望明月，低头思故乡。 encrypt参数用于加密。我们使用下边的命令对这个文件进行加密。\n1 gpg --recipient 74A64469 --output test_en.txt --encrypt test.txt 然后我们在test.txt的同一目录下得到了test_en.txt。我们打开后可以看到加密后的数据为：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 8501 0c03 50c4 def5 490e 5bc8 0107 f901 58c7 1221 33ee cc6c 4b43 8d5d a1f5 1a14 a5ac d406 7f24 a6bf 342c 3ba1 6f95 6d1b 8aae c45a 9a25 dece 7973 f5e0 44a0 7d43 7701 bd7b 02cc 3287 b65e 5915 3a67 2046 2d96 42c0 98fa d468 3187 f340 674a 772c a280 7ab9 73d1 5feb 28c7 bc64 f102 e978 0ca5 ff7e ff1f a0f8 ba6a ea43 cc68 cf15 acff dfe9 fba3 7576 5c78 fc4a 8ed6 232b 6313 8246 ee38 70c2 1b0c 46fb 2064 662e 2977 79a7 64d8 81dd e55f 5b77 edb8 0a0c caa0 9df0 4db2 a1e5 fe5f e16f 7be5 03b4 f741 d1a9 e429 d909 b94b a539 b0cc cc08 70b7 8d1f 4212 ba89 00ed fce4 ba97 6b51 8546 8bfa 1129 9862 d779 0382 bab0 ae0f 4855 bf75 82bf 743d 6b9e 4072 b47f 551d 143a 9355 67b9 dc7a 1511 4d0d 79bc d8d2 b001 f69c af7c 5cd2 6f2c 7d68 8ebc 80d8 07fb d120 fd2b 4a76 774c 8b82 e5e3 3414 de28 f947 16ff be94 ee01 ae40 8deb 6786 bf4f c602 5efb 8ae0 55f6 6cc2 55dc a6de a8e0 0239 7de4 43b5 3344 f5fb 5e8d 9e26 0961 ddae 4f57 be79 6a1b b7fd 1f0b d510 e7ad 9c0c cc7e c75f 06d1 4da7 2ae5 a7d2 02b6 d93c 729b bf94 31dd a627 1423 1f08 db2b e6a3 a9f2 8165 bc16 8641 3430 dbaf 0885 4df6 e5cc f542 d3e6 60e2 91ae c0e7 69d7 8507 9d54 c25d 3a3d 4e63 79dd 8eaf 84 哈哈，如果给你一串这玩意，谁能看懂？ 这也就是为什么编译别的软件的文件的时候显示这内容了，都是进行加密过的文件，只有进行解密后才能读出数据。 recipient参数指定接收者的公钥，output参数指定加密后的文件名，encrypt参数指定源文件。运行上面的命令后，test_en.txt就是已加密的文件，可以把它发给对方。 使用下边的命令进行解密\n1 gpg test_en.txt 依次完成下边的命令：\n1 2 3 4 5 6 7 bogon:Desktop XXXX$ gpg test_en.txt 您需要输入密码，才能解开这个用户的私钥：“Zhang San \u0026lt;zhangsan@163.com\u0026gt;” 2048 位的 RSA 密钥，钥匙号 490E5BC8，建立于 2016-10-08 (主钥匙号 74A64469) gpg: 由 2048 位的 RSA 密钥加密，钥匙号为 490E5BC8、生成于 2016-10-08 “Zhang San \u0026lt;zhangsan@163.com\u0026gt;” gpg: test_en.txt：未知的后缀名 请输入新的文件名 [test.txt]: test2.txt 然后在test2.txt中就看到了解密后的数据。\n签名 有时，我们不需要加密文件，只需要对文件签名，表示这个文件确实是我本人发出的。sign参数用来签名。\n1 gpg --sign test.txt 然后生成了一个test.txt.gpg文件，我们打开这个文件后，发现这也是一个二进制的数据，这并不是加密后的数据，与上边的二进制数据不一样。如果想生成ASCII码的签名文件，可以使用clearsign参数\n1 gpg --clearsign test.txt 然后生成了一个test.txt.asc文件，打开后可以看出：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 张飞，我爱你，今晚约吗？ 床前明月光，疑是地上霜。 举头望明月，低头思故乡。 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAEBAgAGBQJX+Jl5AAoJENlKYip0plVpDIMIAJscuAXq/+g+kBVqSAhL59jr Lbu04uBdyYYbdqokjzSzuQm0ybw5fURQZs7HC5X2A2SgwP5vs/ekWOnS7G2SxBI4 vnrHef3+cFiEbkj4OAySNbUeY3ftbg333JFkAbyA5bD7DHlEHrUvWRWVzLEWGCJ7 FgfbpqtiyFbLbkimXgVP4GhMA+TaP3XCDa1GgI2sJY9+q0GpX7mz6CBbTz7C/ORk GgoUFVx5tyVO8E7PHqGOcLTwwpJtsq0geGMn4QaG5qUY9j851zkVOXSVeUo3y7nY AqRaLqHBBN7xOKs0IQLAJz/5vCEvBEjqAR59NtwA1h9JAUx20VkVO2eu+YaepjU= =vkVW -----END PGP SIGNATURE----- 如果想生成单独的签名文件，与文件内容分开存放，可以使用detach-sign参数。\n1 gpg --detach-sign test.txt 是一个二进制的数据，如果想采用ASCII码形式，要加上armor参数\n1 gpg --armor --detach-sign test.txt 签名+加密 上一节的参数，都是只签名不加密。如果想同时签名和加密，可以使用下面的命令。\n1 gpg --local-user [发信者ID] --recipient [接收者ID] --armor --sign --encrypt test.txt local-user参数指定用发信者的私钥签名，recipient参数指定用接收者的公钥加密，armor参数表示采用ASCII码形式显示，sign参数表示需要签名，encrypt参数表示指定源文件。\n验证签名 我们收到别人签名后的文件，需要用对方的公钥验证签名是否为真。verify参数用来验证\n1 gpg --verify test.txt.asc test.txt 本文转载至：https://www.jianshu.com/p/268064e67719\n","permalink":"https://blog.curlc.com/archives/436/","summary":"\u003cblockquote\u003e\n\u003cp\u003e我们平时都听过非对称加密，公钥和私钥，签名验证，但这些证书都是怎么得到的呢？本篇文章会解答这些问题。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"背景介绍\"\u003e背景介绍\u003c/h2\u003e\n\u003cp\u003e加密的一个简单但又实用的任务就是发送加密电子邮件。多年来，为电子邮件进行加密的标准一直是PGP（Pretty Good Privacy）。程序员Phil Zimmermann特别为电子邮件的保密编写的PGP。 这个软件非常好用，迅速流传开来，成了许多程序员的必备工具。但是，它是商业软件，不能自由使用。 作为PGP的替代，如今已经有一个开放源代码的类似产品可供使用。GPG（Gnu Privacy Guard），它不包含专利算法，能够无限制的用于商业应用。 \u003cstrong\u003e本文将会介绍文件加密，至于GPG的其他用途，比如邮件加密，请参考这个网站\u003ca href=\"https://link.jianshu.com?t=https://help.ubuntu.com/community/GnuPrivacyGuardHowto#Reading_OpenPGP_E-mail\"\u003ehttps://help.ubuntu.com\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e本人使用mac电脑，因此使用brew安装的\u003c/strong\u003e，很简单，打开终端，输入\u003ccode\u003ebrew install gpg\u003c/code\u003e就行了，至于其他的平台，可以自行搜索。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebogon\u003c/span\u003e\u003cspan class=\"o\"\u003e:~\u003c/span\u003e \u003cspan class=\"nx\"\u003eXXXX\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e \u003cspan class=\"nx\"\u003ebrew\u003c/span\u003e \u003cspan class=\"nx\"\u003einstall\u003c/span\u003e \u003cspan class=\"nx\"\u003egpg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003eDownloading\u003c/span\u003e \u003cspan class=\"nx\"\u003ehttps\u003c/span\u003e\u003cspan class=\"o\"\u003e://\u003c/span\u003e\u003cspan class=\"nx\"\u003ehomebrew\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebintray\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003ebottles\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003egnupg\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.4\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e20.\u003c/span\u003e\u003cspan class=\"nx\"\u003eel_capitan\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e######################################################################## 100.0%\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003ePouring\u003c/span\u003e \u003cspan class=\"nx\"\u003egnupg\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.4\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e20.\u003c/span\u003e\u003cspan class=\"nx\"\u003eel_capitan\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ebottle\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003etar\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003egz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e?\u003c/span\u003e  \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003eusr\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003eCellar\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003egnupg\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.4\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e20\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e53\u003c/span\u003e \u003cspan class=\"nx\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mf\"\u003e5.4\u003c/span\u003e\u003cspan class=\"nx\"\u003eM\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e安装完成后，键入命令\u003ccode\u003egpg --help\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e 1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 8\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e 9\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e10\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e11\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e12\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e13\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e14\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e15\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e16\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e17\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e18\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e19\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e20\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e21\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e22\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e23\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e24\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e25\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e26\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e27\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e28\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e29\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e30\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e31\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e32\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e33\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e34\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e35\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e36\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e37\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e38\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e39\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e40\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e41\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e42\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e43\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e44\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e45\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e46\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e47\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e48\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e49\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e50\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e51\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e52\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e53\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e54\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e55\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e56\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e57\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e58\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e59\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e60\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e61\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e62\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e63\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e64\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e65\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e66\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e67\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e68\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e69\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-php\" data-lang=\"php\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003ebogon\u003c/span\u003e\u003cspan class=\"o\"\u003e:~\u003c/span\u003e \u003cspan class=\"nx\"\u003eXXXX\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e \u003cspan class=\"nx\"\u003egpg\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003ehelp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003egpg\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eGnuPG\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"mf\"\u003e1.4\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e20\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eCopyright\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eC\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"mi\"\u003e2015\u003c/span\u003e \u003cspan class=\"nx\"\u003eFree\u003c/span\u003e \u003cspan class=\"nx\"\u003eSoftware\u003c/span\u003e \u003cspan class=\"nx\"\u003eFoundation\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eInc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eLicense\u003c/span\u003e \u003cspan class=\"nx\"\u003eGPLv3\u003c/span\u003e\u003cspan class=\"o\"\u003e+:\u003c/span\u003e \u003cspan class=\"nx\"\u003eGNU\u003c/span\u003e \u003cspan class=\"nx\"\u003eGPL\u003c/span\u003e \u003cspan class=\"nx\"\u003eversion\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e \u003cspan class=\"k\"\u003eor\u003c/span\u003e \u003cspan class=\"nx\"\u003elater\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"o\"\u003e://\u003c/span\u003e\u003cspan class=\"nx\"\u003egnu\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003elicenses\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003egpl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ehtml\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eThis\u003c/span\u003e \u003cspan class=\"nx\"\u003eis\u003c/span\u003e \u003cspan class=\"nx\"\u003efree\u003c/span\u003e \u003cspan class=\"nx\"\u003esoftware\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003eyou\u003c/span\u003e \u003cspan class=\"nx\"\u003eare\u003c/span\u003e \u003cspan class=\"nx\"\u003efree\u003c/span\u003e \u003cspan class=\"nx\"\u003eto\u003c/span\u003e \u003cspan class=\"nx\"\u003echange\u003c/span\u003e \u003cspan class=\"k\"\u003eand\u003c/span\u003e \u003cspan class=\"nx\"\u003eredistribute\u003c/span\u003e \u003cspan class=\"nx\"\u003eit\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eThere\u003c/span\u003e \u003cspan class=\"nx\"\u003eis\u003c/span\u003e \u003cspan class=\"nx\"\u003eNO\u003c/span\u003e \u003cspan class=\"nx\"\u003eWARRANTY\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eto\u003c/span\u003e \u003cspan class=\"nx\"\u003ethe\u003c/span\u003e \u003cspan class=\"nx\"\u003eextent\u003c/span\u003e \u003cspan class=\"nx\"\u003epermitted\u003c/span\u003e \u003cspan class=\"nx\"\u003eby\u003c/span\u003e \u003cspan class=\"nx\"\u003elaw\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eHome\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e~/.\u003c/span\u003e\u003cspan class=\"nx\"\u003egnupg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e支持的算法：\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e公钥：RSA\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eRSA\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003eE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eRSA\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003eS\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eELG\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003eE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eDSA\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e对称加密：IDEA\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"nx\"\u003eDES\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eCAST5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eBLOWFISH\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eAES\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eAES192\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eAES256\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e               \u003cspan class=\"nx\"\u003eTWOFISH\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eCAMELLIA128\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eCAMELLIA192\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eCAMELLIA256\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e散列：MD5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eSHA1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eRIPEMD160\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eSHA256\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eSHA384\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eSHA512\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eSHA224\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e压缩：不压缩\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eZIP\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eZLIB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eBZIP2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e语法：gpg\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003e选项\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003e文件名\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e签名、检查、加密或解密\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e默认的操作依输入数据而定\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e指令：\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003esign\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003e文件名\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e        \u003cspan class=\"nx\"\u003e生成一份签名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003eclearsign\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003e文件名\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e   \u003cspan class=\"nx\"\u003e生成一份明文签名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003edetach\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003esign\u003c/span\u003e             \u003cspan class=\"nx\"\u003e生成一份分离的签名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003eencrypt\u003c/span\u003e                 \u003cspan class=\"nx\"\u003e加密数据\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003esymmetric\u003c/span\u003e               \u003cspan class=\"nx\"\u003e仅使用对称加密\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ed\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003edecrypt\u003c/span\u003e                 \u003cspan class=\"nx\"\u003e解密数据\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003e默认\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003everify\u003c/span\u003e                  \u003cspan class=\"nx\"\u003e验证签名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"k\"\u003elist\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekeys\u003c/span\u003e               \u003cspan class=\"nx\"\u003e列出密钥\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"k\"\u003elist\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003esigs\u003c/span\u003e               \u003cspan class=\"nx\"\u003e列出密钥和签名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003echeck\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003esigs\u003c/span\u003e              \u003cspan class=\"nx\"\u003e列出并检查密钥签名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003efingerprint\u003c/span\u003e             \u003cspan class=\"nx\"\u003e列出密钥和指纹\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003eK\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"k\"\u003elist\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003esecret\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekeys\u003c/span\u003e        \u003cspan class=\"nx\"\u003e列出私钥\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003egen\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekey\u003c/span\u003e                 \u003cspan class=\"nx\"\u003e生成一副新的密钥对\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003edelete\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekeys\u003c/span\u003e             \u003cspan class=\"nx\"\u003e从公钥钥匙环里删除密钥\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003edelete\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003esecret\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekeys\u003c/span\u003e      \u003cspan class=\"nx\"\u003e从私钥钥匙环里删除密钥\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003esign\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekey\u003c/span\u003e                \u003cspan class=\"nx\"\u003e为某把密钥添加签名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003elsign\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekey\u003c/span\u003e               \u003cspan class=\"nx\"\u003e为某把密钥添加本地签名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003eedit\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekey\u003c/span\u003e                \u003cspan class=\"nx\"\u003e编辑某把密钥或为其添加签名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003egen\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003erevoke\u003c/span\u003e              \u003cspan class=\"nx\"\u003e生成一份吊销证书\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003eexport\u003c/span\u003e                  \u003cspan class=\"nx\"\u003e导出密钥\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003esend\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekeys\u003c/span\u003e               \u003cspan class=\"nx\"\u003e把密钥导出到某个公钥服务器上\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003erecv\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekeys\u003c/span\u003e               \u003cspan class=\"nx\"\u003e从公钥服务器上导入密钥\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003esearch\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekeys\u003c/span\u003e             \u003cspan class=\"nx\"\u003e在公钥服务器上搜寻密钥\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003erefresh\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekeys\u003c/span\u003e            \u003cspan class=\"nx\"\u003e从公钥服务器更新所有的本地密钥\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003eimport\u003c/span\u003e                  \u003cspan class=\"nx\"\u003e导入\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nx\"\u003e合并密钥\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003ecard\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003estatus\u003c/span\u003e             \u003cspan class=\"nx\"\u003e打印智能卡状态\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003ecard\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003eedit\u003c/span\u003e               \u003cspan class=\"nx\"\u003e更改智能卡上的数据\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003echange\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003epin\u003c/span\u003e              \u003cspan class=\"nx\"\u003e更改智能卡的\u003c/span\u003e \u003cspan class=\"nx\"\u003ePIN\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdate\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003etrustdb\u003c/span\u003e          \u003cspan class=\"nx\"\u003e更新信任度数据库\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"k\"\u003eprint\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003emd\u003c/span\u003e \u003cspan class=\"nx\"\u003e算法\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003e文件\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                               \u003cspan class=\"nx\"\u003e使用指定的散列算法打印报文散列值\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e选项：\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003earmor\u003c/span\u003e                   \u003cspan class=\"nx\"\u003e输出经\u003c/span\u003e \u003cspan class=\"nx\"\u003eASCII\u003c/span\u003e \u003cspan class=\"nx\"\u003e封装\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003erecipient\u003c/span\u003e \u003cspan class=\"nx\"\u003e某甲\u003c/span\u003e        \u003cspan class=\"nx\"\u003e为收件者“某甲”加密\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003eu\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003euser\u003c/span\u003e              \u003cspan class=\"nx\"\u003e使用这个用户标识来签名或解密\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ez\u003c/span\u003e \u003cspan class=\"nx\"\u003eN\u003c/span\u003e                          \u003cspan class=\"nx\"\u003e设定压缩等级为\u003c/span\u003e \u003cspan class=\"nx\"\u003eN\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"nx\"\u003e表示不压缩\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003etextmode\u003c/span\u003e                \u003cspan class=\"nx\"\u003e使用标准的文本模式\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003eo\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003eoutput\u003c/span\u003e                  \u003cspan class=\"nx\"\u003e指定输出文件\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003everbose\u003c/span\u003e                 \u003cspan class=\"nx\"\u003e详细模式\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003edry\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003erun\u003c/span\u003e                 \u003cspan class=\"nx\"\u003e不做任何改变\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003einteractive\u003c/span\u003e             \u003cspan class=\"nx\"\u003e覆盖前先询问\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003eopenpgp\u003c/span\u003e                 \u003cspan class=\"nx\"\u003e行为严格遵循\u003c/span\u003e \u003cspan class=\"nx\"\u003eOpenPGP\u003c/span\u003e \u003cspan class=\"nx\"\u003e定义\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003epgp2\u003c/span\u003e                    \u003cspan class=\"nx\"\u003e生成与\u003c/span\u003e \u003cspan class=\"nx\"\u003ePGP\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.\u003c/span\u003e\u003cspan class=\"nx\"\u003ex\u003c/span\u003e \u003cspan class=\"nx\"\u003e兼容的报文\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003e请参考在线说明以获得所有命令和选项的完整清单\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e范例：\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ese\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003er\u003c/span\u003e \u003cspan class=\"nx\"\u003eBob\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003e文件名\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e          \u003cspan class=\"nx\"\u003e为\u003c/span\u003e \u003cspan class=\"nx\"\u003eBob\u003c/span\u003e \u003cspan class=\"nx\"\u003e这个收件人签名及加密\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003eclearsign\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003e文件名\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e         \u003cspan class=\"nx\"\u003e做出明文签名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003edetach\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003esign\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003e文件名\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e       \u003cspan class=\"nx\"\u003e做出分离式签名\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"k\"\u003elist\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ekeys\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003e某甲\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e           \u003cspan class=\"nx\"\u003e显示密钥\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"nx\"\u003efingerprint\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003e某甲\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e         \u003cspan class=\"nx\"\u003e显示指纹\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e请向\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003egnupg\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ebugs\u003c/span\u003e\u003cspan class=\"o\"\u003e@\u003c/span\u003e\u003cspan class=\"nx\"\u003egnu\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003e报告程序缺陷。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003e请向\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nx\"\u003ei18n\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"nx\"\u003ezh\u003c/span\u003e\u003cspan class=\"o\"\u003e@\u003c/span\u003e\u003cspan class=\"nx\"\u003egooglegroups\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"nx\"\u003e反映简体中文翻译的问题。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e这些帮助信息非常有用，下边演示的很多功能也是基于上边这些参数的。这里把他们列出来，方便在使用的时候查询。 \u003cstrong\u003e如果能够显示上边的信息，说明GPG安装成功了\u003c/strong\u003e\u003c/p\u003e","title":"GPG入门指南（加密签名）"},{"content":"命令行下具体用法如下： mysqldump -u用戶名 -p密码 -d 数据库名 表名 \u0026gt; 脚本名;\n如果是windows，请到 bin 目录/新增环境变量 执行命令\n1 2 3 4 5 6 7 8 #导出整个数据库结构和数据 mysqldump -h localhost -uroot -p123456 database \u0026gt; dump.sql #导出单个数据表结构和数据 mysqldump -h localhost -uroot -p123456 database table \u0026gt; dump.sql #导出整个数据库结构（不包含数据） mysqldump -h localhost -uroot -p123456 -d database \u0026gt; dump.sql #导出单个数据表结构（不包含数据） mysqldump -h localhost -uroot -p123456 -d database table \u0026gt; dump.sql ","permalink":"https://blog.curlc.com/archives/415/","summary":"\u003cp\u003e\u003cstrong\u003e命令行下具体用法如下：\u003c/strong\u003e \u003c/p\u003e\n\u003cp\u003e\u003ccode\u003emysqldump -u用戶名 -p密码 -d 数据库名 表名 \u0026gt; 脚本名;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e如果是windows，请到 bin 目录/新增环境变量 执行命令\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e6\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e7\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e8\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#导出整个数据库结构和数据\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emysqldump -h localhost -uroot -p123456 database \u0026gt; dump.sql\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#导出单个数据表结构和数据\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emysqldump -h localhost -uroot -p123456  database table \u0026gt; dump.sql\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#导出整个数据库结构（不包含数据）\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emysqldump -h localhost -uroot -p123456  -d database \u0026gt; dump.sql\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e#导出单个数据表结构（不包含数据）\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emysqldump -h localhost -uroot -p123456  -d database table \u0026gt; dump.sql\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"415.mysql利用mysqldump导出表结构和表数据"},{"content":"一、D盾_Web查杀 软件使用自行研发不分扩展名的代码分析引擎，能分析更为隐藏的WebShell后门行为。引擎特别针对一句话后门，变量函数后门，${}执行 、preg_replace执行、call_user_func、file_put_contents、fputs等特殊函数的参数进行针对性的识别，能查杀更为隐藏的后门，并把可疑的参数信息展现在你面前，让你能更快速的了解后门的情况，还加入隔离功能，并且可以还原！\nD盾_Web查杀官方下载地址：http://www.d99net.net/down/WebShellKill_V2.0.9.zip\n2、WebShellkiller WebShellkiller作为一款web后门专杀工具，不仅支持webshell的扫描，同时还支持暗链的扫描。这是一款融合了多重检测引擎的查杀工具。在传统正则匹配的基础上，采用模拟执行，参数动态分析监测技术、webshell语义分析技术、暗链隐藏特征分析技术，并根据webshell的行为模式构建了基于机器学习的智能检测模型。传统技术与人工智能技术相结合、静态扫描和动态分析相结合，更精准地检测出WEB网站已知和未知的后门文件。\nWebShellkiller官方下载地址：http://edr.sangfor.com.cn/tool/WebShellKillerTool.zip\n3、河马查杀 http://www.shellpub.com/ http://www.webshell.pub/\n4、百度WebShell检测 https://scanner.baidu.com/ 原文链接:https://www.hostloc.com/thread-484492-1-1.html\n","permalink":"https://blog.curlc.com/archives/397/","summary":"\u003ch3 id=\"一d盾_web查杀\"\u003e一、D盾_Web查杀\u003c/h3\u003e\n\u003cp\u003e软件使用自行研发不分扩展名的代码分析引擎，能分析更为隐藏的WebShell后门行为。引擎特别针对一句话后门，变量函数后门，${}执行 、preg_replace执行、call_user_func、file_put_contents、fputs等特殊函数的参数进行针对性的识别，能查杀更为隐藏的后门，并把可疑的参数信息展现在你面前，让你能更快速的了解后门的情况，还加入隔离功能，并且可以还原！\u003c/p\u003e\n\u003cp\u003eD盾_Web查杀官方下载地址：http://www.d99net.net/down/WebShellKill_V2.0.9.zip\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.curlc.com/wp-content/uploads/2018/10/WebShellKill_2018-10-22_15-40-47.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"2webshellkiller\"\u003e2、WebShellkiller\u003c/h3\u003e\n\u003cp\u003eWebShellkiller作为一款web后门专杀工具，不仅支持webshell的扫描，同时还支持暗链的扫描。这是一款融合了多重检测引擎的查杀工具。在传统正则匹配的基础上，采用模拟执行，参数动态分析监测技术、webshell语义分析技术、暗链隐藏特征分析技术，并根据webshell的行为模式构建了基于机器学习的智能检测模型。传统技术与人工智能技术相结合、静态扫描和动态分析相结合，更精准地检测出WEB网站已知和未知的后门文件。\u003c/p\u003e\n\u003cp\u003eWebShellkiller官方下载地址：http://edr.sangfor.com.cn/tool/WebShellKillerTool.zip\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog.curlc.com/wp-content/uploads/2018/10/SfAntiBot_2018-10-22_15-42-51.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"3河马查杀\"\u003e3、河马查杀\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"http://www.shellpub.com/\"\u003ehttp://www.shellpub.com/\u003c/a\u003e \u003ca href=\"http://www.webshell.pub/\"\u003ehttp://www.webshell.pub/\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"4百度webshell检测\"\u003e4、百度WebShell检测\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://scanner.baidu.com/\"\u003ehttps://scanner.baidu.com/\u003c/a\u003e   原文链接:https://www.hostloc.com/thread-484492-1-1.html\u003c/p\u003e","title":"分享几款PHP后门查杀软件"},{"content":" 原理: 在收件人google邮箱地址使用「.」和「+」任意搭配使用规则在Gmail邮箱的帐号上做手脚，这样就不用申请账号了~ 比如 我的Gmail邮箱是 abc@gmail.com\n1、利用「.」 1 2 3 a.bc@gmail.com a.b.c@gamil.com ab.c@gmail.com 2、利用「+」 1 2 3 4 abc1@gmail.com abc2@gmail.com abc3@gmail.com ...... 那么在发信的收件人 写上\n1 2 3 abc+1@gmail.com abc+2@gmail.com abc+3@gmail.com \u0026hellip;\u0026hellip; 后面的数字随意变化都能收到\n3、两种方式结合 1 2 3 a.bc+1@gmail.com ab.c+1@gmail.com a.bc+2@gmail.com 这三种方式的邮箱接收的邮件都会发送到 abc@gmail.com 这个账户上。\n暂时只测试了Gmail邮箱，其他邮箱自测~~~\nPs:这样是可以收到邮件不错，但是因为这些邮箱是不存在的，有人注册了就收不到了，或者已经有人注册的~~~\n转自吾爱: https://www.52pojie.cn/thread-786377-1-1.html\n","permalink":"https://blog.curlc.com/archives/191/","summary":"\u003cblockquote\u003e\n\u003cp\u003e原理: 在收件人google邮箱地址使用「.」和「+」任意搭配使用规则在Gmail邮箱的帐号上做手脚，这样就不用申请账号了~ 比如 我的Gmail邮箱是 \u003ca href=\"mailto:abc@gmail.com\"\u003eabc@gmail.com\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e","title":"一个Google 邮箱接收N个账号信件(非关联账户)"},{"content":"上一篇说到家里宽带出问题导致只能用流量上网，这里又遇到另外个问题，在浏览英文网页时，用流量在Chrome根本不能翻译,即使本地开了科学上网，排查了一下，结果发现4G状态下Google翻译的域名也是被屏蔽的，所以把一下三个域名加入PAC或SwitchyOmega的自动给切换规则就好了。 把下面三个域名,添加到自动切换规则之后，不管是流量还是宽带都特别快。(或者是设置PAC规则)\n1 2 3 \\*.googletagmanager.com \\*.google-analytics.com \\*.translate.googleapis.com Ps:本来想用其他浏览器的，但是对比翻译起来还是习惯Chrome了~\n","permalink":"https://blog.curlc.com/archives/153/","summary":"\u003cp\u003e上一篇说到家里宽带出问题导致只能用流量上网，这里又遇到另外个问题，在浏览英文网页时，用流量在Chrome根本不能翻译,即使本地开了科学上网，排查了一下，结果发现4G状态下Google翻译的域名也是被屏蔽的，所以把一下三个域名加入PAC或SwitchyOmega的自动给切换规则就好了。  \u003c/p\u003e\n\u003cp\u003e把下面三个域名,添加到自动切换规则之后，不管是流量还是宽带都特别快。(或者是设置PAC规则)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-txt\" data-lang=\"txt\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\*.googletagmanager.com \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\*.google-analytics.com \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\\*.translate.googleapis.com \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003cimg alt=\"SwitchyOmega规则\" loading=\"lazy\" src=\"https://blog.curlc.com/wp-content/uploads/2018/09/chrome_2018-07-18_02-52-36.png\"\u003e\u003c/p\u003e\n\u003cp\u003ePs:本来想用其他浏览器的，但是对比翻译起来还是习惯Chrome了~\u003c/p\u003e","title":"Chrome翻译慢与经常失败问题"},{"content":"刚刚写的代码忘记提交本地仓库而直接更新，导致写的代码不见了，百度了一番，看到了解决方案~\nVCS--git--unstash changes 可以看到暂存列表，通过 view 查看代码，apply就是回到该版本，stage就是一个类似于暂存区的东西，可以将你未提交的改动暂存起来，相当于存档一样，然后可以去做别的事情，等做完之后可以读档一样把当时的状态恢复\n","permalink":"https://blog.curlc.com/archives/145/","summary":"\u003cp\u003e刚刚写的代码忘记提交本地仓库而直接更新，导致写的代码不见了，百度了一番，看到了解决方案~\u003cbr\u003e\n\u003ccode\u003eVCS--git--unstash changes\u003c/code\u003e  可以看到暂存列表，通过 view 查看代码，apply就是回到该版本，stage就是一个类似于暂存区的东西，可以将你未提交的改动暂存起来，相当于存档一样，然后可以去做别的事情，等做完之后可以读档一样把当时的状态恢复\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"x\" loading=\"lazy\" src=\"https://blog.curlc.com/wp-content/uploads/2018/09/idea64_2018-07-09_01-05-03.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"x\" loading=\"lazy\" src=\"https://blog.curlc.com/wp-content/uploads/2018/09/idea64_2018-07-09_01-05-40.png\"\u003e\u003c/p\u003e","title":"IDEA git 未提交代码被覆盖"},{"content":"错误信息： Another app is currently holding the yum lock; waiting for it to exit\u0026hellip; The other application is: yum Memory : 125 M RSS (1.3 GB VSZ) Started: Sun Jul 8 08:48:46 2018 - 03:43 ago State : Running, pid: 898 强制关掉yum进程： 1 rm -f /var/run/yum.pid ","permalink":"https://blog.curlc.com/archives/137/","summary":"\u003ch2 id=\"错误信息\"\u003e错误信息：\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAnother app is currently holding the yum lock; waiting for it to exit\u0026hellip; The other application is: yum Memory : 125 M RSS (1.3 GB VSZ) Started: Sun Jul 8 08:48:46 2018 - 03:43 ago State : Running, pid: 898  \u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"强制关掉yum进程\"\u003e强制关掉yum进程：\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm -f /var/run/yum.pid\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e","title":"yum提示Another app is currently holding the yum lock"},{"content":"秋水逸冰 一键测试脚本bench.sh https://teddysun.com/444.html\n秋水逸冰 Linux性能测试UnixBench一键脚本 https://teddysun.com/245.html\n蜗牛789 一键测试脚本 https://www.wn789.com/13397.html\n1、VPS测试 1 wget -qO- bench.sh | bash 测试VPS基础信息，以及下载速度，来自官网(https://bench.sh/)\n2、国内测试 1 wget -qO- git.io/superbench.sh | bash 主要包括VPS硬件信息，国内节点测试，电信、联通、移动，来自老鬼\n3、基础测试 1 2 3 4 5 中文版: wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/ZBench/master/ZBench-CN.sh \u0026amp;\u0026amp; bash ZBench-CN.sh 英文版： wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/ZBench/master/ZBench.sh \u0026amp;\u0026amp; bash ZBench.sh #基于superbench脚本，增加了路由和ping测试，区别中英文 4、网速测试 1 wget https://raw.githubusercontent.com/oooldking/script/master/superspeed.sh \u0026amp;\u0026amp; chmod +x superspeed.sh \u0026amp;\u0026amp; ./superspeed.sh #主要包括国内的一些节点进行专项测试，电信、联通、移动，来自老鬼\n5、Ping测试 1 2 wget -N --no\\-check-certificate https://raw.githubusercontent.com/FunctionClub/uPing/master/uping.py python uping.py #一款长时间ping测试py脚本\n6、html5网速程序 1 https://github.com/adolfintel/speedtest #需要php环境，下载后解压即可运行，无须安装\n7、SS一键包4版本 和谐\n8、锐速/BBR集成一键包 1 wget -N --no\\-check-certificate \u0026#34;https://raw.githubusercontent.com/chiakge/Linux-NetSpeed/master/tcp.sh\u0026#34; \u0026amp;\u0026amp; chmod +x tcp.sh \u0026amp;\u0026amp; ./tcp.sh #一键安装锐速/bbr，以及魔改等，支持卸载、升级等操作。\n9、锐速一键包 1 wget -N --no\\-check-certificate https://github.com/91yun/serverspeeder/raw/master/serverspeeder.sh \u0026amp;\u0026amp; bash serverspeeder.sh #一键安装锐速破解全功能版，不支持openvz架构，来自91yun（https://www.91yun.co/archives/683）\n10、GoogleBBR一键脚本 1 wget --no\\-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh\u0026amp;\u0026amp; chmod + x bbr.sh \u0026amp;\u0026amp; ./bbr.sh #一键安装并开启bbr功能，google出品的一种TCP拥塞算法，不支持openvz虚拟架构。\n11、锐速一键包 1 wget --no\\-check-certificate -O appex.sh https://raw.githubusercontent.com/0oVicero0/serverSpeeder\\_Install/master/appex.sh \u0026amp;\u0026amp; chmod +x appex.sh \u0026amp;\u0026amp; bash appex.sh install #另一位爱好者开发的锐速一键安装脚本，开发：https://github.com/0oVicero0/serverSpeeder_Install（看了下是萌卡大佬的）\n12、FS一键包 1 wget -N --no\\-check-certificate https://raw.githubusercontent.com/91yun/finalspeed/master/install\\_fs.sh \u0026amp;\u0026amp; bash install\\_fs.sh #一键安装finalspeed功能，支持全系架构\n13、L2TP一键包 和谐\n14、自动备份脚本 1 2 3 wget -N --no\\-check-certificate https://raw.githubusercontent.com/Himly/vps-shell/master/AutoBackupToFtp.sh chmod +x AutoBackupToFtp.sh bash AutoBackupToFtp.sh #每天自动备份MYSQL及打包网站目录\n15、VPS跑分测试 1 2 3 wget --no\\-check-certificate https://github.com/teddysun/across/raw/master/unixbench.sh chmod +x unixbench.sh ./unixbench.sh #unixbench进行跑分测试，单核和多核不同跑分\n","permalink":"https://blog.curlc.com/archives/135/","summary":"\u003cp\u003e秋水逸冰 一键测试脚本bench.sh \u003ca href=\"https://teddysun.com/444.html\"\u003ehttps://teddysun.com/444.html\u003c/a\u003e\u003cbr\u003e\n秋水逸冰 Linux性能测试UnixBench一键脚本 \u003ca href=\"https://teddysun.com/245.html\"\u003ehttps://teddysun.com/245.html\u003c/a\u003e\u003cbr\u003e\n蜗牛789 一键测试脚本  \u003ca href=\"https://www.wn789.com/13397.html\"\u003ehttps://www.wn789.com/13397.html\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"1vps测试\"\u003e1、VPS测试\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget -qO- bench.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e测试VPS基础信息，以及下载速度，来自官网(\u003ca href=\"https://bench.sh/\"\u003ehttps://bench.sh/\u003c/a\u003e)\u003c/p\u003e\n\u003ch2 id=\"2国内测试\"\u003e2、国内测试\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget -qO- git.io/superbench.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e主要包括VPS硬件信息，国内节点测试，电信、联通、移动，来自老鬼\u003c/p\u003e\n\u003ch2 id=\"3基础测试\"\u003e3、基础测试\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e3\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e4\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e5\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e中文版:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/ZBench/master/ZBench-CN.sh \u0026amp;\u0026amp; bash ZBench-CN.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e英文版：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/ZBench/master/ZBench.sh \u0026amp;\u0026amp; bash ZBench.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#基于superbench脚本，增加了路由和ping测试，区别中英文\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003ch2 id=\"4网速测试\"\u003e4、网速测试\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget https://raw.githubusercontent.com/oooldking/script/master/superspeed.sh \u0026amp;\u0026amp; chmod +x superspeed.sh \u0026amp;\u0026amp; ./superspeed.sh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e#主要包括国内的一些节点进行专项测试，电信、联通、移动，来自老鬼\u003c/p\u003e\n\u003ch2 id=\"5ping测试\"\u003e5、Ping测试\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003cspan class=\"lnt\"\u003e2\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget -N --no\\-check-certificate https://raw.githubusercontent.com/FunctionClub/uPing/master/uping.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython uping.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e#一款长时间ping测试py脚本\u003c/p\u003e\n\u003ch2 id=\"6html5网速程序\"\u003e6、html5网速程序\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttps://github.com/adolfintel/speedtest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e#需要php环境，下载后解压即可运行，无须安装\u003c/p\u003e","title":"VPS一键脚本收集"},{"content":"这个商家我是5月在主机测评上看见的，不限流量，饭桶机房，我买的是10刀一月的，今天刚好看见有终身8折优惠码就下单了， 就简单的和上次买的比较下~~~\n5月 购买 7月 购买 在路由上都一样，饭桶机房，唯一有点变化的就是 CPU频率和IO了，第一台的IO测试第一次只有223M/s，刚买的有570M/s~~~ 看宝塔的跑分 CPU和硬盘的差距蛮大的~\n","permalink":"https://blog.curlc.com/archives/131/","summary":"\u003cp\u003e这个商家我是5月在主机测评上看见的，不限流量，饭桶机房，我买的是10刀一月的，今天刚好看见有终身8折优惠码就下单了， 就简单的和上次买的比较下~~~\u003c/p\u003e\n\u003ch2 id=\"5月-购买\"\u003e5月 购买\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"x\" loading=\"lazy\" src=\"https://blog.curlc.com/wp-content/uploads/2018/07/5%E6%9C%88.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"x\" loading=\"lazy\" src=\"https://blog.curlc.com/wp-content/uploads/2018/07/Ho%E9%A5%AD%E6%A1%B6%E6%9C%BA%E6%88%BF%E8%B7%91%E5%88%86-5%E6%9C%88.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"7月-购买\"\u003e7月 购买\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"x\" loading=\"lazy\" src=\"https://blog.curlc.com/wp-content/uploads/2018/07/7%E6%9C%88.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"x\" loading=\"lazy\" src=\"https://blog.curlc.com/wp-content/uploads/2018/07/Ho%E9%A5%AD%E6%A1%B6%E6%9C%BA%E6%88%BF%E8%B7%91%E5%88%86.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"x\" loading=\"lazy\" src=\"https://blog.curlc.com/wp-content/uploads/2018/07/%E8%B7%AF%E7%94%B11.png\"\u003e\u003c/p\u003e\n\u003cp\u003e在路由上都一样，饭桶机房，唯一有点变化的就是 CPU频率和IO了，第一台的IO测试第一次只有223M/s，刚买的有570M/s~~~ 看宝塔的跑分 CPU和硬盘的差距蛮大的~\u003c/p\u003e","title":"hosteons商家VPS 简单测试"},{"content":"TOTP 是一个基于时间的一次性密码算法（也称时间同步的动态密码）。它使用共享密钥和当前时间来生成一个密码，目前这个算法已经写入国际标准 RFC 6238，并且多被用于双因素认证（2FA）系统。\n算法原理 简介 动态口令的基本认证原理是认证双方使用同一个共享密钥对时间进行密码算法计算，之后比较计算值是否一致从而进行认证。TOTP 使用加密散列函数将密钥与当前时间戳结合，来生成一次性密码。 在认证双方比对计算值是否一致的过程中会有各种原因的延迟。比如在同一个哈希有效期的时间长度内，动态密码生成的结果是一样的，但是由于网络的原因，客户端生成密码的时间和服务器接受密码的时间可能差距会很大，导致两个密码不在同一个哈希有效期的时间长度内，所以导致认证失败。这个时候就需要验证系统有一个延时的策略，可以允许验证前几个哈希有效期的时间长度的动态密码。但是哈希有效期的时间长度设置的越大，就会更容易导致被攻击破解，并且每一个哈希有效期的时间长度只会生成一个密码，所以时间如果过长的话会影响用户体验，因此权衡考虑安全性和可用性这里默认的哈希有效期的时间长度为 30 秒。\n算法 1 TOTP = Truncate(HMAC−SHA−1(SecretKey,((unixtime(now) − unixtime(T0)) / TS)) HMAC−SHA−1 是从 SHA1 哈希函数构造的一种哈希算法，被用作 HMAC（基于哈希的消息验证代码），此 HMAC 进程将密钥与消息数据混合，使用哈希函数对混合结果进行哈希计算，将所得哈希值与该密钥混合，然后再次应用哈希函数，输出的哈希值长度为 160 位。SecretKey 是服务端与客户端共享的一个任意字节的秘钥。unixtime(now) 是当前 Unix 时间戳，unixtime(T0) 是约定的起始时间点的时间戳，默认是 0 ，也就是 1970年1月1日。 TS 为哈希有效期的时间长度，默认为 30 秒。\n要求 服务端与客户端之间共享密钥 服务端与客户端之间时间相同 服务端与客户端之间使用相同的哈希有效期的时间长度 经典场景 参考资料 RFC 6238 - Time-Based One-Time Password Algorithm Cryptographic hash function Hash-based message authentication code Time-Based One-Time Password Algorithm 本文转自: https://www.vtrois.com/totp-tutorial.html\n","permalink":"https://blog.curlc.com/archives/120/","summary":"\u003cp\u003eTOTP 是一个基于时间的一次性密码算法（也称时间同步的动态密码）。它使用共享密钥和当前时间来生成一个密码，目前这个算法已经写入国际标准 RFC 6238，并且多被用于双因素认证（2FA）系统。\u003c/p\u003e\n\u003ch2 id=\"算法原理\"\u003e算法原理\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://www.vtrois.com/wp-content/uploads/totp.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"简介\"\u003e简介\u003c/h3\u003e\n\u003cp\u003e动态口令的基本认证原理是认证双方使用同一个共享密钥对时间进行密码算法计算，之后比较计算值是否一致从而进行认证。TOTP 使用加密散列函数将密钥与当前时间戳结合，来生成一次性密码。 在认证双方比对计算值是否一致的过程中会有各种原因的延迟。比如在同一个哈希有效期的时间长度内，动态密码生成的结果是一样的，但是由于网络的原因，客户端生成密码的时间和服务器接受密码的时间可能差距会很大，导致两个密码不在同一个哈希有效期的时间长度内，所以导致认证失败。这个时候就需要验证系统有一个延时的策略，可以允许验证前几个哈希有效期的时间长度的动态密码。但是哈希有效期的时间长度设置的越大，就会更容易导致被攻击破解，并且每一个哈希有效期的时间长度只会生成一个密码，所以时间如果过长的话会影响用户体验，因此权衡考虑安全性和可用性这里默认的哈希有效期的时间长度为 30 秒。\u003c/p\u003e\n\u003ch3 id=\"算法\"\u003e算法\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\"\u003e1\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-c\" data-lang=\"c\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eTOTP\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nf\"\u003eTruncate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eHMAC\u003c/span\u003e\u003cspan class=\"err\"\u003e−\u003c/span\u003e\u003cspan class=\"n\"\u003eSHA\u003c/span\u003e\u003cspan class=\"err\"\u003e−\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSecretKey\u003c/span\u003e\u003cspan class=\"p\"\u003e,((\u003c/span\u003e\u003cspan class=\"nf\"\u003eunixtime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"err\"\u003e−\u003c/span\u003e \u003cspan class=\"nf\"\u003eunixtime\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eT0\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"n\"\u003eTS\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e\u003ccode\u003eHMAC−SHA−1\u003c/code\u003e 是从 SHA1 哈希函数构造的一种哈希算法，被用作 HMAC（基于哈希的消息验证代码），此 HMAC 进程将密钥与消息数据混合，使用哈希函数对混合结果进行哈希计算，将所得哈希值与该密钥混合，然后再次应用哈希函数，输出的哈希值长度为 160 位。\u003ccode\u003eSecretKey\u003c/code\u003e 是服务端与客户端共享的一个任意字节的秘钥。\u003ccode\u003eunixtime(now)\u003c/code\u003e 是当前 \u003ccode\u003eUnix\u003c/code\u003e 时间戳，\u003ccode\u003eunixtime(T0)\u003c/code\u003e 是约定的起始时间点的时间戳，默认是 0 ，也就是 1970年1月1日。 \u003ccode\u003eTS\u003c/code\u003e 为哈希有效期的时间长度，默认为 30 秒。\u003c/p\u003e\n\u003ch3 id=\"要求\"\u003e要求\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e服务端与客户端之间共享密钥\u003c/li\u003e\n\u003cli\u003e服务端与客户端之间时间相同\u003c/li\u003e\n\u003cli\u003e服务端与客户端之间使用相同的哈希有效期的时间长度\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"经典场景\"\u003e经典场景\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://www.vtrois.com/wp-content/uploads/totp-tutorial.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"参考资料\"\u003e参考资料\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://tools.ietf.org/html/rfc6238\"\u003eRFC 6238 - Time-Based One-Time Password Algorithm\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Cryptographic_hash_function\"\u003eCryptographic hash function\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Hash-based_message_authentication_code\"\u003eHash-based message authentication code\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm\"\u003eTime-Based One-Time Password Algorithm\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e本文转自: https://www.vtrois.com/totp-tutorial.html\u003c/p\u003e","title":"基于时间的一次性密码 TOTP"},{"content":"此教程仅适用与 E3、E5 、A1 、A1P等等，不适用于个人账号。\n2020-08-17 更新 现在可以直接在后台进行修改，不用powershell 了，使用管理员账户登录。 https://admin.microsoft.com/Adminportal/Home?source=applauncher#/users\n以下仅做保留，上面的步骤就可以完成修改。 1、修改 Onedrive容量 1T 修改 为5T 登录管理员帐号 打开 https://admin.onedrive.com/?v=StorageSettings 修改默认的onedrive 1024 为 5120 此时就算是修改成功了，但是对于老用户来说容量还是没有变的，这里有两个方法 1、删除重建 用户(不现实，老帐号里面还有资料） 2、使用 powershell 工具 这里就使用第二种方法\n2、老帐号不删除重建 准备工作 安装 SharePoint Online Management Shell 工具 下载地址：https://www.microsoft.com/zh-CN/download/details.aspx?id=35588 选择自己系统的版本 下载安装完成后，在开始菜单可以找到 1、在shell窗口中，输入以下代码 Connect-SPOService -Url https://\u0026lt;orgnam e\u0026gt;-admin.sharepoint.com 注意： (1) 是你注册MSDN的 组织名字 (2)可以从Onedrive登录后的地址中获取，比如我的登录后地址是 https://curlc-my.sharepoint.com/personal/admin_xm_mk/_layouts/15/onedrive.aspx 那么我的 则是 curlc ，也就是 -my.sharepoint.com 前面的 curlc 我的完整代码如下 Connect-SPOService -Url https://curlc-admin.sharepoint.com\n2、登录 输入完成后回车 ， 此时跳出一个窗口输入管理员的邮件地址和密码 (输入回车后 如果 shell没有红色字体报错的话，就说明成功连接。)\n3、更改特定用户的OneDrive的存储空间 继续输入以下代码 Set-SPOSite -Identity https://curlc-my.sharepoint.com/personal/admin888_xm mk -StorageQuota 5242880 比如 要修改 admin888@xm.mk 这个用户的 OneDrive容量 ，那么 则为 https://curlc-my.sharepoint.com/personal/admin888_xm_mk 注意 红色 的地方，则要修改为你的 组织名字，蓝色的则是 待修改 的用户名，\u0026quot;@ 与 . \u0026ldquo;符号用下划线表示\n输入完成后如果没有红色的错误提示，那么就完成了,Onedrive容量已经变成5T啦。 退出或者刷新OneDrive客户端，就可以看见容量。\nPs: 这里第一步和第三步，一定要在同一个Shell下完成，否则报错，因为直接执行第三步，无法识别你的身份\n","permalink":"https://blog.curlc.com/archives/66/","summary":"\u003cp\u003e此教程仅适用与 E3、E5 、A1 、A1P等等，不适用于个人账号。\u003c/p\u003e\n\u003ch2 id=\"2020-08-17-更新\"\u003e2020-08-17 更新\u003c/h2\u003e\n\u003cp\u003e现在可以直接在后台进行修改，不用powershell  了，使用管理员账户登录。 \u003ca href=\"https://admin.microsoft.com/Adminportal/Home?source=applauncher#/users\"\u003ehttps://admin.microsoft.com/Adminportal/Home?source=applauncher#/users\u003c/a\u003e\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/08/16/imageee7bed9950cf16c1.png\"\u003e\n\u003cimg loading=\"lazy\" src=\"https://img.qyi.io/images/2020/08/16/imageff89b7d99ce99d73.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"以下仅做保留上面的步骤就可以完成修改\"\u003e\u003cstrong\u003e以下仅做保留，上面的步骤就可以完成修改。\u003c/strong\u003e\u003c/h2\u003e\n\u003chr\u003e\n\u003ch2 id=\"1修改onedrive容量-1t-修改-为5t\"\u003e1、修改 Onedrive容量 1T 修改 为5T\u003c/h2\u003e\n\u003cp\u003e登录\u003cstrong\u003e管理员\u003c/strong\u003e帐号 打开 https://admin.onedrive.com/?v=StorageSettings 修改默认的onedrive 1024 为 5120 \u003cimg alt=\"图片已丢失\" loading=\"lazy\" src=\"https://img.curlc.com/images/2019/07/23/e3d4f2dea29aaa8d42f10d33f66bb416.png\"\u003e 此时就算是修改成功了，但是对于老用户来说容量还是没有变的，这里有两个方法 1、删除重建 用户(不现实，老帐号里面还有资料） 2、使用 powershell  工具 这里就使用第二种方法\u003c/p\u003e\n\u003ch2 id=\"2老帐号不删除重建\"\u003e2、老帐号不删除重建\u003c/h2\u003e\n\u003ch3 id=\"准备工作\"\u003e准备工作\u003c/h3\u003e\n\u003cp\u003e安装 SharePoint Online Management Shell 工具 下载地址：\u003ca href=\"https://www.microsoft.com/zh-CN/download/details.aspx?id=35588\"\u003ehttps://www.microsoft.com/zh-CN/download/details.aspx?id=35588\u003c/a\u003e 选择自己系统的版本 下载安装完成后，在开始菜单可以找到 \u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/07/23/2e03ee722fd11f189fe17dd580e47aae.png\"\u003e \u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/07/23/4adbb233b946bb2659fe78e302ea5a4c.png\"\u003e \u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/07/23/ee90f106064ff6a9a4f58bc37409715c.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"1在shell窗口中输入以下代码\"\u003e1、在shell窗口中，输入以下代码\u003c/h3\u003e\n\u003ch3 id=\"connect-sposervice--url-httpsorgnam-e-adminsharepointcom\"\u003e\u003ccode\u003eConnect-SPOService -Url https://\u0026lt;orgnam e\u0026gt;-admin.sharepoint.com\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003e注意： (1)\u003corgnam e\u003e 是你注册MSDN的 \u003cstrong\u003e组织名字\u003c/strong\u003e (2)可以从Onedrive登录后的地址中获取，比如我的登录后地址是 \u003ccode\u003ehttps://curlc-my.sharepoint.com/personal/admin_xm_mk/_layouts/15/onedrive.aspx\u003c/code\u003e 那么我的 则是 \u003cstrong\u003ecurlc\u003c/strong\u003e ，也就是 -my.sharepoint.com 前面的 \u003cstrong\u003ecurlc\u003c/strong\u003e 我的完整代码如下 \u003ccode\u003eConnect-SPOService -Url https://curlc-admin.sharepoint.com\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"2登录\"\u003e2、登录\u003c/h3\u003e\n\u003cp\u003e输入完成后回车 ， 此时跳出一个窗口输入\u003cstrong\u003e管理员的邮件地址和密码\u003c/strong\u003e (输入回车后 如果 shell没有红色字体报错的话，就说明成功连接。)\u003c/p\u003e\n\u003ch3\u003e\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/07/23/64d5fad3bf8b8b3cd3556e1c69bf95a7.png\"\u003e\u003c/h3\u003e\n\u003ch3 id=\"3更改特定用户的onedrive的存储空间\"\u003e3、更改特定用户的OneDrive的存储空间\u003c/h3\u003e\n\u003cp\u003e继续输入以下代码 \u003ccode\u003eSet-SPOSite -Identity https://curlc-my.sharepoint.com/personal/admin888_xm mk -StorageQuota 5242880\u003c/code\u003e 比如 要修改 \u003ca href=\"mailto:admin888@xm.mk\"\u003eadmin888@xm.mk\u003c/a\u003e 这个用户的 OneDrive容量 ，那么 则为 \u003ccode\u003ehttps://curlc-my.sharepoint.com/personal/admin888_xm_mk\u003c/code\u003e 注意 红色 的地方，则要修改为你的 组织名字，蓝色的则是 待修改 的用户名，\u0026quot;@ 与 . \u0026ldquo;符号用下划线表示\u003cbr\u003e\n\u003cimg loading=\"lazy\" src=\"https://img.curlc.com/images/2019/07/23/aa65e85cfc62bb025e237827a1f561a7.png\"\u003e\u003c/p\u003e","title":"OneDrive容量 1T 修改 为5T，老账号不删重建"},{"content":"这个源码利用百度网盘秒传机制，实现任意文件分享链接生成与批量转存。\n打开网址 http://bd.xm.mk/\n1、生成转存专用链接\n在一键分享页面可以生成 bdpan://专用链，该专用链包含文件的特征值；\n!https://blog.curlc.com/wp-content/uploads/2018/09/QQ截图20180517214249-1024x484.png\n再点击此区域，在弹出的选择框中选择要分享的文件\n!https://blog.curlc.com/wp-content/uploads/2018/09/QQ截图20180517214813-1024x468.png\nPS:这里选择文件时，必须选择百度云盘里面已经存在的，否则转存没有意义。\n2、输入待转存的 专用链\n在一键转存页面可以输入别人分享的bdpan://专用链，批量转存到自己的网盘。\n!https://blog.curlc.com/wp-content/uploads/2018/09/QQ截图20180517214337-1024x455.png\n3、关于获取 百度 BDUSS 的方法\n使用 Chrome 或 Chromium 内核的浏览器 下载插件 EditThisCookie http://wp.cccyun.cc/assets/tool/bduss.crx 下载该插件并运行，提示添加(无法添加说明浏览器不支持)，添加完成后浏览器右上角会多个饼干图标 打开百度登录页面 https://passport.baidu.com/ 在登录页面登录后，点击浏览器右上角的饼干图标，找到BDUSS，复制内容即可 !https://blog.curlc.com/wp-content/uploads/2018/09/bduss.png\nPs:本网站不会存储你的 百度BDUSS，也不会发送到第三方\n源码来自第三方，此源码的版权暂时未知，如果谁知道源码版权，我加上哦~\n使用方法：\n生成分享链接只支持Chrome 、Edge 或 Chromium 内核的浏览器，生成后即可在网上发布。\n一键转存需要先获取自己的百度BDUSS，支持批量转存，支持多文件夹转存。\n其它的在帮助页面查看。\nhttp://blog.cccyun.cc/content/uploadfile/201805/bdpan.zip\n","permalink":"https://blog.curlc.com/archives/60/","summary":"\u003cp\u003e这个源码利用百度网盘秒传机制，实现任意文件分享链接生成与批量转存。\u003c/p\u003e\n\u003cp\u003e打开网址 \u003ca href=\"http://bd.xm.mk/\"\u003ehttp://bd.xm.mk/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e1、生成转存专用链接\u003c/p\u003e\n\u003cp\u003e在一键分享页面可以生成 bdpan://专用链，该专用链包含文件的特征值；\u003c/p\u003e\n\u003cp\u003e!https://blog.curlc.com/wp-content/uploads/2018/09/QQ截图20180517214249-1024x484.png\u003c/p\u003e\n\u003cp\u003e再点击此区域，在弹出的选择框中选择要分享的文件\u003c/p\u003e\n\u003cp\u003e!https://blog.curlc.com/wp-content/uploads/2018/09/QQ截图20180517214813-1024x468.png\u003c/p\u003e\n\u003cp\u003ePS:这里选择文件时，必须选择百度云盘里面已经存在的，否则转存没有意义。\u003c/p\u003e\n\u003cp\u003e2、输入待转存的 专用链\u003c/p\u003e\n\u003cp\u003e在一键转存页面可以输入别人分享的bdpan://专用链，批量转存到自己的网盘。\u003c/p\u003e\n\u003cp\u003e!https://blog.curlc.com/wp-content/uploads/2018/09/QQ截图20180517214337-1024x455.png\u003c/p\u003e\n\u003cp\u003e3、关于获取 百度 BDUSS 的方法\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e使用 Chrome 或 Chromium 内核的浏览器\u003c/li\u003e\n\u003cli\u003e下载插件 EditThisCookie \u003ca href=\"http://wp.cccyun.cc/assets/tool/bduss.crx\"\u003ehttp://wp.cccyun.cc/assets/tool/bduss.crx\u003c/a\u003e\n下载该插件并运行，提示添加(无法添加说明浏览器不支持)，添加完成后浏览器右上角会多个饼干图标\u003c/li\u003e\n\u003cli\u003e打开百度登录页面 \u003ca href=\"https://passport.baidu.com/\"\u003ehttps://passport.baidu.com/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e在登录页面登录后，点击浏览器右上角的饼干图标，找到BDUSS，复制内容即可\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e!https://blog.curlc.com/wp-content/uploads/2018/09/bduss.png\u003c/p\u003e\n\u003cp\u003ePs:本网站不会存储你的 百度BDUSS，也不会发送到第三方\u003c/p\u003e\n\u003cp\u003e源码来自第三方，此源码的版权暂时未知，如果谁知道源码版权，我加上哦~\u003c/p\u003e\n\u003cp\u003e使用方法：\u003c/p\u003e\n\u003cp\u003e生成分享链接只支持Chrome 、Edge 或 Chromium 内核的浏览器，生成后即可在网上发布。\u003c/p\u003e\n\u003cp\u003e一键转存需要先获取自己的百度BDUSS，支持批量转存，支持多文件夹转存。\u003c/p\u003e\n\u003cp\u003e其它的在帮助页面查看。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.cccyun.cc/content/uploadfile/201805/bdpan.zip\"\u003ehttp://blog.cccyun.cc/content/uploadfile/201805/bdpan.zip\u003c/a\u003e\u003c/p\u003e","title":"百度网盘另类免和谐分享 一键转存 一键分享"}]